У меня проблема с точной настройкой регулярного выражения
Вопрос
у меня есть регулярное выражение, и оно было в порядке, но, как выяснилось, в некоторых ситуациях оно не работает
Следите за предварительным просмотром сообщения, потому что редактор сообщений делает некоторые хитрые вещи с помощью "\"
[\[]?[\^%#\$\*@\-;].*?[\^%#\$\*@\-;][\]]
его задача — найти закономерность, которая в целом выглядит так
[АБА]
- 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%]
Роб