Ruby regex получает слово combo, разделенное точкой - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь использовать регулярное выражение Ruby, чтобы получить словосочетание, как показано ниже. В приведенном ниже примере мне нужны только случаи 1-4, * помеченные в заглавных буквах для удобства тестирования. Слово в середине (dbo, bcd) может быть чем угодно или не похоже на случай № 3. У меня проблемы с тем, как заставить этот случай с двойным периодом № 3 работать. Также хорошо, чтобы слово SALES было в качестве отдельного слова, но, вероятно, это слишком много для одного регулярного выражения? Tx для всех гуру. Это мой скрипт который частично работает, нужно добавить alpha..SALES

 s = '1 alpha.dbo.SALES    2 alpha.bcd.SALES    3 alpha..SALES    4 SALES
      bad cases 5x alpha.saleS  6x  saleSXX'

 regex = /alpha+\.+[a-z]+\.?sales/ix
 puts 'R: ' + s.scan(regex).to_s

##R: ["alpha.dbo.SALES", "alpha.bcd.SALES"]

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018
r = /
    (?<=\d[ ])        # match a digit followed by a space in a positive lookbehind
    (?:               # begin a non-capture group
      \p{Alpha}+        # match one or more letters
      \.                # match a period
      (?:               # begin a non-capture group
        \p{Alpha}+      # match one or more letters
        \.              # match a period
        |               # or
        \.              # match a period
      )                 # end non-capture group
    )?                  # end non-capture group and optionally match it
    SALES             # match string
    (?!=[.\p{Alpha}]) # do not match a period or letter (negative lookahead)
    /x                # free-spacing regex definition mode.

s.scan(r)
  #=> ["alpha.dbo.SALES", "alpha.bcd.SALES", "alpha..SALES", "SALES"]

Это регулярное выражение обычно записывается следующим образом.

r = /
    (?<=\d )(?:\p{Alpha}+\.(?:\p{Alpha}+\.|\.))?SALES(?!=[.\p{Alpha}])/

В режиме свободного пробела пробел должен быть помещен в класс символов ([ ]);иначе это будет удалено.

0 голосов
/ 15 сентября 2018
s = '1 alpha.dbo.SALES    2 alpha.bcd.SALES    3 alpha..SALES    4 SALES
bad cases 5x alpha.saleS  6x  saleSXX 7x alpha.abc.SALES.etc'

regex = /(?<=^|\s)(?:alpha\.[a-z]*\.)?(?:sales)(?=\s|$)/i
puts 'R: ' + s.scan(regex).to_s

Выход:

R: ["alpha.dbo.SALES", "alpha.bcd.SALES", "alpha..SALES", "SALES"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...