Регулярное выражение: сопоставить строку, содержащую не более трех последовательных B (без использования отрицательного предвкушения) - PullRequest
3 голосов
/ 13 апреля 2020

Это простой вопрос, но я только недавно начал изучать регулярное выражение.

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

Должно совпадать:

sdBBdfsBBB

BfsBBBdsfBBB

Не должно совпадать:

fsBBBBsfBB

BBBBBfsBBBsd

Мне не разрешено использовать отрицательный прогноз, только основные операции и ярлыки, и я не знаю, как это решить ... Я знаю, что регулярное выражение .*B{1,3}.* будет соответствовать строкам, которые я хочу мое регулярное выражение соответствует, но оно также соответствует тем, которым я не хочу, чтобы мое регулярное выражение соответствовало ...

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Вы можете описать выражение как последовательность не-B или от одного до трех B с, за которыми следует не-B или конец строки.

^([^B]|B{1,3}([^B]|$))*$
  • ^ начало строки
  • ( ... )* ноль или более ...
    • [^B] что-то отличное от B
    • | или
    • B{1,3}([^B]|$) от одного до трех B с, за которым следует конец строки или что-то другое
  • $ конец строки

Если вы хотите исключить пустую строку, просто замените * на + (что означает «один или несколько»).

1 голос
/ 13 апреля 2020

Чтобы не совпадать с пустыми строками, вы можете сопоставить повторяющиеся наборы по 1-3 раза с B, по крайней мере, с любым символом, за исключением того, что B между или соответствует строке, заканчивающейся 1-3 раза по a B

^(?:[^B]*(?:B{1,3}[^B]+)+B{0,3}|[^B]*B{1,3})$
  • ^ Начало строки
  • (?: Группа без захвата
    • [^B]* Совпадение 0+ раз с любым символом, кроме B
    • (?: Группа без захвата
      • B{1,3}[^B]+ Повторите 1+ раз 1-3 B и 1+ раз любой символ, кроме B
    • )+ Закройте группу и повторите 1+ раз
    • B{0,3} Совпадение 0-3 B в конце
    • | Или
    • [^B]*B{1,3} Совпадение 0+ раз с любым символом, кроме B и затем 1-3 раза a B
  • ) Закрыть группу
  • $ Конец строки

Regex demo

Если допускается пустая строка, шаблон можно сократить до

^(?:[^B]*(?:B{1,3}[^B]+)*B{0,3})$

Regex demo

Примечание , класс отрицанных символов [^B] соответствует любому символу, кроме B, и может также соответствовать новой строке. Чтобы запретить сопоставление символов новой строки, используйте [^B\r\n] или [^B\s] для исключения пробельных символов.

1 голос
/ 13 апреля 2020

как насчет предоставления правильных отрицательных совпадений до и после и повторения:

^((^|[^B]*?)B{1,3}($|[^B]+?))+?$

тестовый пример

Обновление 2: совпадения BBBxBBByBBB правильно

объяснение REGEX:

  1. (^|[^B]*?) => соответствует началу текста или, возможно, пустой строке предшествующих не B символов (не жадно)
  2. B{1,3} => сопоставлять подряд B до 3 раз
  3. ($|[^B]+?) => сопоставлять конец текста или последовательных не-B символов (без жадности)
  4. Окончательно ^(pattern)+?$ => совпадать с началом текста, повторять совпадения внутри шаблона (хотя бы один раз), до конца текста

Обновленное регулярное выражение соответствует ТОЛЬКО первым 2 строкам, последние 2 не совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...