Я пытаюсь использовать регулярное выражение Ruby, чтобы получить комбинацию слов, как показано ниже. В приведенном ниже примере мне нужны только случаи 1–4, * они помечены заглавными буквами для облегчения тестирования. Слово в середине (dbo, bcd) может быть чем угодно или ничего, как в случае №3. У меня проблемы, как заставить работать этот случай с двойным периодом №3. Также хорошо иметь автономный SALES как слово, но, вероятно, это слишком много для одного регулярного выражения? Передайте всем гуру. Это мой скрипт, который частично работает, нужно добавить 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"]
1
Mich28 15 Сен 2018 в 17:11

2 ответа

Лучший ответ
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"]
2
Matt 15 Сен 2018 в 17:21
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}])/

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

2
Cary Swoveland 16 Сен 2018 в 03:43