Regex для таких шаблонов, как [ABC], ABC и ABCxx, где xx - это число - PullRequest
0 голосов
/ 29 мая 2019

У меня есть текст, длина которого может варьироваться от 1 до 1000. Я ищу, чтобы извлечь следующие подстроки из текста.

  1. Подстрока в форме ABCxx / ABCx, где ABC - это всегда английские алфавиты, а x / xx - это число, которое может варьироваться от 0 до 99 (числовая длина равна 1 или 2).,Следующее регулярное выражение выполняет всю мою работу по извлечению этой подстроки - [a-zA-Z]{3}[0-9]{1,2}

  2. Подстрока вида <space>ABC<space>, ABC (последняя подстрока / слово в тексте) иABC (первая подстрока в тексте).В основном здесь я пытаюсь найти трехбуквенное слово, разделенное пробелами в тексте.
    Для получения вышеуказанных совпадений у меня есть следующие регулярные выражения.

[ ][a-zA-Z]{3}[ ], [ ][a-zA-Z]{3} and [a-zA-Z]{3}[ ]
То же, что 2, но строка из трех символов также может быть заключена в квадратную скобку, например [ABC].
\[([a-zA-Z]{3})\]  

Поскольку шаблоны более или менее похожи, можно ли объединить все 5 из них?

Например: ABC catmat dogdog [rat] LAN45 eat HGF1 jkhgkj abc

Здесь действительносовпадения ABC, rat, LAN45, eat, HGF1, abc.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019
R = /
    \p{L}{3}\d{1,2}    # match 3 letters followed by 1 or 2 digits
    |                  # or
    (?<=\A|\p{Space})  # match start of string or a space in a pos lookbehind
    (?:                # begin a non-capture group
      \p{L}{3}         # match three letters
      |                # or
      \[\p{L}{3}\]     # match three letters surrounded by brackets
    )                  # end of non-capture group
    (?=\p{Space}|\z)   # match space or end of string in a pos lookahead
    /x                 # free-spacing regex definition mode

"ABC catmat dogdog [rat] LAN45 eat HGF1 jkhgkj abc".scan R
   #=> ["ABC", "[rat]", "LAN45", "eat", "HGF1", "abc"] 

Это регулярное выражение записано условно (не в режиме свободного пробела):

R = /\p{L}{3}\d{1,2}|(?<=\A| )(?:\p{L}{3}\[\p{L}{3}\])(?= |\z)/

Теперь рассмотрим:

 "ABCD123 [efg]456".scan R
   #=> ["BCD12"]

Я считаю, что это согласуется с формулировкой задачи, но если "BCD12" не должно быть совпадением, если перед ним стоит буква или следует цифра (здесь применяются оба), тогда регулярное выражение должно бытьизменено следующим образом.

R = /
    (?<=\A|\p{Space})  # match start of string or a space in a pos lookbehind
    (?:                # begin a non-capture group
      \p{L}{3}         # match three letters
      \d{,2}           # match 0, 1 or 2 digits      
      |                # or
      \[\p{L}{3}\]     # match three letters surrounded by brackets
    )                  # end of non-capture group
    (?=\p{Space}|\z)   # match space or end of string in a pos lookahead
    /x                 # free-spacing regex definition mode

"ABC catmat dogdog [rat] XLAN45 eat HGF123 jkhgkj abc".scan R
  #=> ["ABC", "[rat]", "eat", "abc"]

Обратите внимание, что в обоих регулярных выражениях я заменил \p{Space} пробелом.В свободном интервале пробелы удаляются до разбора регулярного выражения, поэтому они должны быть записаны \p{Space}, [[:space:]], [ ] (класс символов, содержащий пробел), \ символ пробела или, если необходимо, \s для символа пробела (который включает пробелы, символы новой строки, символы табуляции и некоторые другие символы).

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

Спасибо всем за ваши ответы.Это регулярное выражение помогло мне.

(\ b [a-zA-Z] {3} ([0-9] {1,2})? \ B)

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