2010-01-27 2 views

ответ

2

Если не может быть вложенными тегами вы можете использовать следующее регулярное выражение:

\[%=(.*?)%] 

символы означают следующее:

 
\[ Match a literal [ character. The backslash is required otherwise [ would 
     start a character class. 
%= Match %= 
(.*?) Match any characters, non-greedy. i.e. as few as possible. The parentheses 
     capture the match so that you can refer to it later. 
%] Match %] - Note that it is not necessary to escape ] here, but you can if 
     you want. 

Вот как вы можете использовать его в C#:

string s = "sanfdsg[%=jdgashg%]jagsklasg"; 
Match match = Regex.Match(s, @"\[%=(.*?)%]"); 
if (match.Success) 
{ 
    Console.WriteLine(match.Groups[1].Value); 
} 

Выход:

jdgashg 

Или, чтобы получить несколько матчей:

string s = "foo[%=bar%]baz[%=qux%]quux"; 
foreach (Match match in Regex.Matches(s, @"\[%=(.*?)%]")) 
{ 
    Console.WriteLine(match.Groups[1].Value); 
} 

Выход:

bar 
qux 

Примечание строка символов записывается как @ "...". Это означает, что обратные косые черты внутри строки рассматриваются как буквальные обратные косые черты, а не escape-коды. Это часто полезно при написании регулярных выражений на C#, чтобы избежать дублирования всех обратных косых черт внутри строки. Здесь это не имеет большого значения, но в более сложных примерах это поможет больше.

0
(?<=\[%=).*?(?=%]) 

будет соответствовать любому тексту (включая линейные разрывы) между этими двумя разделителями (без соответствия самих разделителей). Вложенные разделители не поддерживаются.

Чтобы перебрать все матчи:

Regex my_re = new Regex(@"(?<=\[%=).*?(?=%\])", RegexOptions.Singleline); 
Match matchResults = my_re.Match(subjectString); 
while (matchResults.Success) { 
    // matched text: matchResults.Value 
    // match start: matchResults.Index 
    // match length: matchResults.Length 
    matchResults = matchResults.NextMatch(); 
} 
0
\[%=([^%]|%[^\]])*%\] 

Это не зависит от какой-либо из операторов жадностью и, таким образом, следует переводить на любой язык регулярных выражений. Вы можете или не должны заботиться об этом.

+0

Мне нравится этот: D – Gumbo

0

Попробуйте это:

\[%=((?:[^%]|%[^\]])*)%] 
+0

Да, и этот тоже выглядит неплохо;) –

+0

@Nate C-K: Да, два идиота, одна мысль. – Gumbo

+0

У меня возник вопрос о регулярном выражении для комментариев в стиле С неправильно в тесте один раз, так что теперь решение навсегда сгорело в моем мозгу. –

2

Вы можете использовать простой

\[%=(.*?)%\] 

, но вы должны понимать, что это не будет обрабатывать правильно гнездиться. Если содержание может занимать несколько строк, вам также необходимо указать RegexOption.Singleline, чтобы сделать границы .*?.

+0

Никакое регулярное выражение не может обрабатывать гнездование. –

+1

@Nate - уверен, что он может. рекурсивное регулярное выражение. –

+0

Нет такой вещи, как рекурсивное регулярное выражение (несмотря на то, что люди могут ошибочно придумать). Если он рекурсивный, то он по определению не является регулярным. –

Смежные вопросы