特定の単語に一致する正規表現をどのように記述すればよいですか?

特定の単語に一致する正規表現をどのように記述すればよいですか?

特定の正規表現を機能させようとしましたが、必要な動作を実行できません。

基本的に、ROCKET を検索します。正規表現は、ROCKET の大文字/小文字、句読点の有無に関係なく一致する必要がありますが、別の単語の一部である場合は一致しません。したがって、正規表現は次のいずれかでトリガーされます。

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

しかし、ROCKETが次のような場所で見つかった場合はトリガーされません。

Rocketeer
Sprocket

オンラインの正規表現ジェネレーターを使用して正しいものにしようとしましたが、正確に一致させることができません。

答え1

ブックマークすることをお勧めしますMSDN 正規表現クイックリファレンス

英数字以外の文字で囲まれた単語「rocket」を大文字と小文字を区別せずに一致させたいとします。有効な正規表現は次のようになります。

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

これは、ゼロ個以上の (*) 非英数字 (\W) 文字を検索し、その後に大文字と小文字を区別しない rocket のバージョン ( (?i)rocket(?-i) ) が続き、その後に再びゼロ個以上の (*) 非英数字 (\W) が続くものを検索します。rocket 一致用語を囲む追加の括弧により、一致が別のグループに割り当てられます。したがって、rocket という単語は一致グループ 1 になります。

更新1: Matt はコメントで、この正規表現は Python で使用すると述べています。Python の構文は少し異なります。Python で同じ結果を得るには、この正規表現を使用し、オプションをor関数re.IGNORECASEに渡します。compilematch

\W*(rocket)\W*

の上正規表現101これは、正規表現入力の横のテキストボックスに「i」と入力することでシミュレートできます。

アップデート2Ismael は、正規表現は「1rocket1」に一致する可能性があるため、正確ではないと述べています。彼は、より優れた解決策を投稿しました。

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

答え2

この場合、先読みはやりすぎだと思うので、オプションで単語境界を使用する方が良いでしょうignorecase

\brocket\b

つまり、Python では次のようになります。

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']

答え3

grepsed使用する場合、 を使用できます\<rocket\>。 を使用する場合grep-iオプションにより大文字と小文字が区別されなくなります (大文字と小文字を区別しない):

grep -i '\<rocket\>'

すべての正規表現で大文字と小文字を区別しない方法はわかりませんがsed、原始人の方法は常に存在します:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'

答え4

必要な単語を特定するには、次のようなものを使用できると思います。 /^(rocket|RoCKEt)$/g

関連情報