[正規表現]頻出しそうな正規表現のまとめの続きです
正規表現は頻出するもの、あまり頻出しないものもありますね。
ここでははじめての正規表現とベストプラクティス#3: 冒頭/末尾にマッチするメタ文字とセキュリティ、文字セットの否定と範囲を元に
頻出するものとそこまでは頻出しないかもしれないものも取り上げてみます
#実行環境
正規表現はRubularを使うとさっと試せます
NOT論理
とある文字列をヒットさせたくない場合などに[^hoge]
とすることで、カッコ内の文字を検索から外します。NOT論理ですね。
ここで削除するのはhoge
という文字列ではなく、h,o,g,e
以外の1文字となります
例えばabcdeの間にhogeという文字をそれぞれ入れた文字列
ahbocgdeenの場合、hogeを検索結果から削除します
検索 | 検索文字列 | 検索結果(太文字が検索結果) |
---|---|---|
[^hoge] | ahbocgdeen | ahbocgdee |
[^みかん]食う客。 | あ、柿食う客。かき食う客。みかん食う客。 | あ、柿食う客。かき食う客。みかん食う客。 |
#英字や数字自体を指定
次に英字、数字自体を検索対象にしたい場合-
を使用することで英字や数字を指定することができます
ASCIIコードをもとに文字の範囲を簡潔に表すことができます。
例えば[0-9]とすることで数字を表せます。
仕組みは文字コードを範囲で指定することにより、検索範囲を指定することができます。
その範囲を-
で指定します
検索 | 検索対象 | 備考 |
---|---|---|
[0-9] | 数字 | |
[A-Z] | 大文字英字 | |
[ぁ-ん] | 全角ひらがな | 特殊なひらがなは対象外 |
[ァ-ヴー] | 全角カタカナ | 特殊なカタカナは対象外 |
ただし[A-z]とすると、文字コードによってはZからaの間に[
や_
などといった記号にまでマッチしてしまいます。
そのため大文字小文字共に英字を検索するためには[a-zA-Z]とする必要があります。なお[z-A]とすると引っかからないです
#境界文字検索
\b
とすると〈単語をなす文字〉の列の両端をマッチさせることができます
具体的には単語の両端に「スペース」または「記号」があると、そこが〈単語をなす文字〉の境界と認識されます。
文字列の「冒頭」や「末尾」、そして「改行」や「タブ」も境界と認識されます。
ただし、英文字に接している「数字」や「アンダースコア」は境界と認識されません。
「ひらがな」や「漢字」や「ラテン文字」は環境によって異なります(Rubularでは境界と認識されなかったです)
検索 | 検索文字列 | 検索結果(太文字が検索結果) |
---|---|---|
\bair\b | air _air_ | air _air_ |
(コメントを受けて補足。文字コードによって<単語をなす文字>が変わる場合がございます。上記の<単語をなす文字>はRubularでの結果です。)
#文字列先頭と文字列末尾
ここはサクッと。
\A
文字列先頭を示します
\z
文字列末尾を示します
例
検索 | 検索文字列 | 検索結果(太文字が検索結果) |
---|---|---|
\Aあ、 | あ、柿食う客。を見る柿食う客。柿をも食う客 | あ、柿食う客。を見る柿食う客。柿をも食う客 |