Regex: получить содержимое между [% = и%] - PullRequest
0 голосов
/ 27 января 2010

Может кто-нибудь помочь мне получить контент между [% = и%].

Ответы [ 6 ]

2 голосов
/ 27 января 2010

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

\[%=(.*?)%]

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

\[    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

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

2 голосов
/ 27 января 2010

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

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

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

1 голос
/ 27 января 2010

%=\s?(.*?)\s?% возможно?

0 голосов
/ 27 января 2010

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

\[%=((?:[^%]|%[^\]])*)%]
0 голосов
/ 27 января 2010
\[%=([^%]|%[^\]])*%\]

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

0 голосов
/ 27 января 2010
(?<=\[%=).*?(?=%])

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

Чтобы перебрать все совпадения:

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();
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...