У меня проблема с точной настройкой регулярного выражения

StackOverflow https://stackoverflow.com/questions/293694

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

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

его задача — найти закономерность, которая в целом выглядит так

[АБА]

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

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

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

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

  • "[#образец1#]"
  • "[%sample2%]"
  • "[#образец3#]"

я понимаю это

  • "[#образец1#]"
  • "[%sample2%]"
  • "- [#образец3#]"

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

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

[АВС]

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

например

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

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

МТХ

Это было полезно?

Решение

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

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

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

Матчи

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

РЕДАКТИРОВАТЬ

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

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)([\^%#\$\*@\-;])\]

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

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

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

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

[\]]?

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

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

В этом случае для каждого возможного разделителя существует подшаблон.| Персонаж - это "или", поэтому он будет соответствовать, если какое -либо из 3 подражаний соответствует.

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

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

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

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

Роб

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top