У меня проблема с тонкой настройкой регулярных выражений - PullRequest
1 голос
/ 16 ноября 2008

У меня есть регулярное выражение, которое было в порядке, но, как оказалось, в некоторых ситуациях оно не работает

Следите за предварительным просмотром сообщений, потому что редактор сообщений делает некоторые хитрые вещи с "\"

[? \ [] [\ ^% # \ $ \ * @ \ -;] * [\ ^% # \ $ \ * @ \ -;.?] [\]]

Его задача - найти шаблон, который в общем случае выглядит так

[ABA]

  • A - символ из множества ^,%, #, $, *, @, -,;
  • B - немного текста
  • [и] включены в шаблон
Ожидается, что

найдет все вхождения этого шаблона в тестовой строке

Черная лиса [# sample1 #] [% sample2%] - [# sample3 #] ест блоки.

но вместо ожидаемого списка матчей

  • "[# sample1 #]"
  • "[% sample2%]"
  • "[# sample3 #]"

Я понял

  • "[# sample1 #]"
  • "[% sample2%]"
  • "- [# sample3 #]"

И, похоже, эта проблема будет возникать и с другими символами в наборе "A". Так может кто-нибудь предложить изменения в моем регулярном выражении, чтобы он работал так, как мне нужно?

и менее важная вещь, как заставить мое регулярное выражение исключать шаблоны, которые выглядят так

[ABC]

  • A - символ из множества ^,%, #, $, *, @, -,;
  • B - немного текста
  • C - символ из множества ^,%, #, $, *, @, - ,; кроме A
  • [и] включены в шаблон

например

[$ sample1 #] [% sample2 @] [% sample3;]

заранее спасибо

MTH

Ответы [ 3 ]

3 голосов
/ 16 ноября 2008
\[([%#$*@;^-]).+?\1\]

применяется к тексту:

Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.

соответствует

  • [#sample1#]
  • [%sample2%]
  • [#sample3#]
  • , но не [%sample4;]

EDIT

Это работает для меня (вывод, как и ожидалось, регулярное выражение принято C #, как и ожидалось):

Regex re = new Regex(@"\[([%#$*@;^-]).+?\1\]");
string s = "Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.";

MatchCollection mc = re.Matches(s);
foreach (Match m in mc)
{
  Console.WriteLine(m.Value);
}
1 голос
/ 16 ноября 2008

У вас есть опциональное соответствие открывающей квадратной скобки:

[\]]

Для второй части вашего вопроса (и, возможно, чтобы упростить) попробуйте это:

\ [\% [^ \%] + \% \] | \ [\ # [^ \ #] + \ # \] | \ [\ $ [^ \ $] + \ $ \]

В этом случае для каждого возможного разделителя есть подшаблон. | символ «ИЛИ», поэтому он будет совпадать, если любое из 3 подвыражений совпадает.

Каждое подвыражение будет:

  • Открывающая скобка
  • Специальный символ
  • Все, что не является специальным символом (1)
  • Специальный символ
  • Закрывающий лист

(1), возможно, потребуется добавить дополнительные исключения, такие как ']' или '[', чтобы они случайно не совпадали с большим объемом текста, например:

[% MyVar #] бла-бла [$ OtherVar%]

Rob

1 голос
/ 16 ноября 2008

Почему первый "?" в "[[]?"

\[[\^%#\$\*@\-;].*?[\^%#\$\*@\-;]\]

будет нормально определять ваши разные строки

Чтобы быть более точным:

\[([\^%#\$\*@\-;])([^\]]*?)(?=\1)([\^%#\$\*@\-;])\]

обнаружит [ABA]

\[([\^%#\$\*@\-;])([^\]]*?)(?!\1)([\^%#\$\*@\-;])\]

обнаружит [ABC]

...