Regex, чтобы найти числа из строки в другом формате - PullRequest
2 голосов
/ 25 июня 2019

У меня есть следующий текст:

instance=hostname1, topic="AB_CD_EF_12345_ZY_XW_001_000001"
instance=hostname2, topic="AB_CD_EF_1345_ZY_XW_001_00001"
instance=hostname1, topic="AB_CD_EF_1235_ZY_XW_001_000001"
instance=hostname2, topic="AB_CD_EF_GH_4567_ZY_XW_01_000001"
instance=hostname1, topic="AB_CD_EF_35678_ZY_XW_001_00001"
instance=hostname2, topic="AB_CD_EF_56789_ZY_XW_001_000001"

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

Regex: *.topic="AB_CD_EF_([^_]+).*    
Matches: 12345 1345 1235

Regex: *.topic="AB_CD_EF_GH_([^_]+).*
Matches: 4567 35678 56789

Но мне нужно регулярное выражение, которое может дать мне все числа, например:

12345 1345 1235 4567 35678 56789

Ответы [ 4 ]

3 голосов
/ 25 июня 2019

Сделать GH_ необязательно:

.*topic="AB_CD_EF_(GH_)?([^_]+).*

, который соответствует всем вашим целевым числам.

См. демоверсия .


Вы могли бы быть более общим, разрешив любое число последовательностей "подчеркивание буквы", используя:

.*topic="(?:[A-Z]{2}_)+([^_]+).*

См. живое демо .

1 голос
/ 25 июня 2019

У меня сработало регулярное выражение:

/.*topic="(?:[AB_CD_EF_(GH_)]{2,3}_)+([^_]]+).*/
1 голос
/ 25 июня 2019

Другим вариантом, который мы могли бы назвать, было бы выражение, подобное:

topic=".*?[A-Z]_([0-9]+)_.*?"

, и наши желаемые цифры находятся в этой группе захвата ([0-9]+).

Пожалуйста, см.демо для дополнительного объяснения.

1 голос
/ 25 июня 2019

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

Regex

^instance\=hostname[0-9]+\,\s*topic\=\“[A-Z_]+([0-9]+)_[A-Z_]+[0-9_]+\”$

Попробуйте в этом ДЕМО .

Разбивка

^                # Asserts position at start of the line
hostname[0-9]+   # Matches any and all hostname numbers
\s*              # Matches whitespace characters (between 0 and unlimited times)
[A-Z_]+          # Matches any upper-case letter or underscore (between 1 and unlimited times)
([0-9]+)         # This captures the number you want
$                # Asserts position at end of the line

Хотя это действительно отвечает на вопрос, который вы задали, я боюсь, что это может быть не совсем то, что вы ищете, но без дополнительной информации это лучшее, что я могу вам дать. В любом случае, после того, как вы изучите разбивку и поиграете с демо-версией, она должна вам помочь.

...