RegEx для количественного определения и поиска персонажа - PullRequest
0 голосов
/ 29 мая 2019

Учитывая строку из 12 символов, я хочу разбить строку на три группы по четыре символа и найти символ в группах 1 и 3.

Например:

AAAABBBBAAAA  -> B not found (they are in group 2)
ABAABBBBAAAA  -> B found in the first 4 characters (group 1)
AAAABBBBABAA  -> B found in the last 4 characteres (group 2)

Мне удалось создать только группы 1 и 3, но я не знаю, как найти на них букву «В»:

(^.{0,4})|(.{0,4}$)

Спасибо

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Вы можете попробовать это.Это находит 'B' в любой группе 4.

Версия Perl:
^(?:(?=.{0,3}(B))?....)(?:(?=.{0,3}(B))?....)(?:(?=.{0,3}(B))?....)$
Версия PCRE:
^(?:(?:(?=.{0,3}(B)))?....)(?:(?:(?=.{0,3}(B)))?....)(?:(?:(?=.{0,3}(B)))?....)$

https://regex101.com/r/yV72s2/1

Объяснено

 ^ 
 (?:
      (?=
           .{0,3} 
           ( B )                         # (1), B in first group of 4
      )?
      . . . . 
 )

 (?:
      (?=
           .{0,3} 
           ( B )                         # (2), B in second group of 4
      )?
      . . . . 
 )

 (?:
      (?=
           .{0,3} 
           ( B )                         # (3), B in third group of 4
      )?
      . . . . 
 )
 $

Если вы просто хотите узнать, соответствует ли буква 'B' в первой или последней 4, это будет

(?:^(?=.{12}$)(?:(?=.{0,3}?(B))....)|(?<=^.{8})(?:(?=.{0,3}?(B))....)$)

https://regex101.com/r/wEdTCU/1

Объяснено

 (?:
      ^ 
      (?= .{12} $ )
      (?:
           (?=
                .{0,3}? 
                ( B )                         # (1), B in first group of 4
           )
           . . . . 
      )
   |  
      (?<= ^ .{8} )
      (?:
           (?=
                .{0,3}? 
                ( B )                         # (2), B in third group of 4
           )
           . . . . 
      )
      $ 
 )
1 голос
/ 31 мая 2019

Если квантификаторы с бесконечной шириной или заранее заданным диапазоном поддерживаются в lookbehind , как, например, в .NET, Python PyPi regex module или Java, вы также можете использовать:

(?<=^[AB]{0,3})B|B(?=[AB]{0,3}$)

Пример регулярного выражения в C #

Объяснение

  • (?<=^[AB]{0,3}) Утверждение того, что слеваначало строки, 0-3 раза A или B
  • B Совпадение буквально
  • | Или
  • B Совпадение буквально
  • (?=[AB]{0,3}$) Подтвердите, что справа 0-3 раза A или B, подтвердите конец строки
1 голос
/ 29 мая 2019

Как правило, вы хотите сопоставить B с 3 или менее символами позади ...

(?<=^...|^..|^.|^)B

или B с 3 или менее символами после них.

B(?=.{0,3}$)

Итак, это должно соответствовать всем B, которые удовлетворяют вашим условиям:

(?<=^...|^..|^.|^)B|B(?=.{0,3}$)

Мы используем положительный взгляд вперед и положительный взгляд позади здесь,Те будут проверять ваши ограничения, не будучи частью матча.Это означает, что в матче будет отображаться только то, что вас интересует (B).Причина, по которой мы не используем квантификатор (например, .{0,3}), в том, что квантификаторы обычно не работают с ними.Вот почему мы прибегаем к подходу "грубой силы": ^...|^..|^.|^.

Смотрите это в прямом эфире!

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

B(?=.{8,11}$)|B(?=.{0,3}$)

Смотрите вживую!

...