2015-04-18 17:16:31 +0000 2015-04-18 17:16:31 +0000
20
20

Как мне написать регекс, чтобы соответствовать определенному слову?

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

В основном, я хочу, чтобы он искал ROCKET. Регекс должен совпадать с ROCKET в верхнем или нижнем регистре, и с пунктуацией или без нее, но не тогда, когда это часть другого слова. Таким образом, регекс сработает на любом из этих:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

, но НЕ сработает на ROCKET, когда он будет найден в чем-то вроде

Rocketeer
Sprocket

Я пытался получить его правильно с помощью регекс-генератора онлайн, но я не могу получить его точное совпадение.

Ответы (4)

11
11
11
2015-04-18 17:32:40 +0000

Я предлагаю сделать закладку для MSDN Regular Expression Quick Reference

Вы хотите достичь нечувствительного к регистру совпадения для слова “ракета” в окружении не-алфавитно-цифровых символов. Регекс, который будет работать:

\W*((?i)rocket(?-i))\W*

Что он будет делать, так это искать ноль или больше (*) не-алфавитно-цифровых (\W) символов, за которыми следует нечувствительная к регистру версия ракеты (?i)rocket(?-i)), за которой снова следует ноль или больше (*) не-алфавитно-цифровых символов (\W). Дополнительные круглые скобки вокруг совпадающего по знаку термина “ракета” присваивают соответствие отдельной группе. Таким образом, слово rocket будет находиться в группе соответствия 1.

UPDATE 1: Матт сказал в комментарии, что этот регекс будет использоваться в питоне. У питона немного другой синтаксис. Для достижения того же результата на питоне, используйте этот регекс и передайте опцию re.IGNORECASE в функцию compile или match.

\W*(rocket)\W*

On Regex101 это можно смоделировать, введя “i” в текстовом поле рядом с вводом регекса.

UPDATE 2 Исмаэль упоминал, что регекс не совсем корректен, так как он может совпадать с “1rocket1”. Он разместил гораздо лучшее решение, а именно

(?:^|\W)rocket(?:$|\W).

10
10
10
2015-04-19 06:17:43 +0000

Я думаю, что в этом случае выглядеть слишком много, и лучше использовать границы слов с опцией ignorecase,

\brocket\b

Другими словами, в python:

&00001

1
1
1
2015-04-19 04:00:42 +0000

С grep и sed, вы можете использовать \<rocket\>.  С grep, -i вариант сделает его регистронезависимым ( i gnore случае):

grep -i '\<rocket\>'

Я не знаю, как сделать все sed regexes регистронезависимыми, но всегда есть пещерный человек способ:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
0
0
0
2019-11-23 10:06:05 +0000

Используйте опцию Поиск только для целых слов.

Что касается пунктуаций, вы не сможете ответить, пока не узнаете вкус/вкус.

Это очень старая тема, так что отправлено для кого-то, кто может посетить с необходимостью, позже. Тот, кто создал эту нить, возможно, перешел на что-то другое… Нет?

Похожие вопросы

3
22
6
12
5