正規表現 JAVA Script

提供: yonewiki
移動: 案内, 検索

目次

概要

以下に正規表現 JAVA Scriptのパターンマッチについて解説を記します。 matchメソッドなら、検索された文字が返却され、searchメソッドなら検索された文字があったポジション(先頭はゼロ)番号が返却されます。例では、matchメソッドを利用しています。他の言語でも具体的な使い方が異なることはありますが、正規表現の記述原理自体は共通していますので、参考になる場合もあります。具体的な利用については文字列検索 matchメソッド以降の記事を参照


検索

/ ~ /(検索文字指定部分)

/ ~ / のように"/"まれた部分に書いた文字が検索文字になります。例えば
  • ex1:"文字列正規表現検索Regular Expression".match(/Regular/)
結果:Regular ※9番目の文字からのモノに一致。


とした場合、Regularという文字列を検索し、文字列の中盤の文字列配列番号9に一致し、Regularという文字列が検索結果として返却される。一致しなければnullが返却される。


"." ドット(何らかの文字一文字)

"." ドットは何らかの文字一文字に対応
  • ex2:"文字列正規表現検索Regular Expression".match(/.文字列/)
結果:null ※文字列というキーワードなら存在するが、先頭にあるため、何らかの文字が無いので検索結果は不一致となる。つまり、「超文字列」という文章を対象に同じ検索をすると一致する。そして、検索の結果、なんらかの文字も"超"であり、超文字列だと判明する。
  • ex3:"超文字列正規表現検索Regular Expression".match(/.文字列/)
結果:超文字列 ※0番目の文字からのモノに一致。


  • ex4:"文字列正規表現検索Regular Expression".match(/..表現/)
結果:正規表現 ※3番目の文字からのモノに一致。
".." 2連続ドットなら、なんらかの文字2つに表現となる文字列を検索していることになる。


"*" アスタリスク(直前の文字ゼロ文字以上)

"*" アスタリスクは直前の文字ゼロ文字以上に対応
  • ex5:"超文字列正規表現検索Regular Expression".match(/超*/)
結果:超 ※0番目の文字からのモノに一致。繰り返しの文字がなくても、あっても文字列というキーワードがあれば一致します。
  • ex6:"超超超超超文字列正規表現検索Regular Expression".match(/超*/)
結果:超超超超超 ※0番目の文字からのモノに一致し、繰り返している分だけ一致した文字が返却される。
  • ex7:"文字列正規表現検索Regular Expression".match(/超*文字列/)
結果:文字列 ※0番目の文字からのモノに一致し、超は使われていなくても良く、以降に書かれた文字列というキーワードにさえ一致すればよいということにも注意が必要です。


"+" プラス(直前の文字1文字以上)

"+" プラスは直前の文字1文字以上に対応
  • ex8:"文字列正規表現検索Regular Expression".match(/超+文字列/)
結果:null ※一致する部分はなくなります。超は少なくとも1回以上使われていないと一致したことにならず、以降に書かれた文字列というキーワードがあっても、一致しないことになります。"*"とは意味が異なることに注意が必要です。
  • ex9:"超超超超文字列正規表現検索Regular Expression".match(/超+文字列/)
結果:超超超超文字列 ※0番目の文字からのモノに一致し、以降に書かれた文字列というキーワードがあれば、一致します。繰り返されていれば"*"と同じような一致が起こるということです。


"?" クェスチョンマーク、クェスションマーク(直前の文字0文字か1文字)

"?" クェスチョンマーク(イクスクラメーションマーク)は直前の文字0文字か1文字に対応
  • ex10:"超超超超文字列正規表現検索Regular Expression".match(/超?文字列/)
結果:超文字列 ※3番目の文字からのモノに一致(4文字目)し、0番目から2番目の繰り返しは無視されます。超がなくても文字列というキーワードだけでも一致は起こります。次の例に示すような感じです。
  • ex11:"文字列正規表現検索Regular Expression".match(/超?文字列/)
結果:文字列 ※0番目の文字からのモノに一致し、超がなくても文字列というキーワードだけでも一致は起こります。

"*?","+?","??", */+/?直後のクェスションマーク(最小マッチング)

理解しづらい表現の一つになりますが、上記までに指定した記号による、繰り返し文字マッチングはここで紹介する方法を利用しない限りは最長のマッチングを優先します。ex9では超+文字列という検索にたいしては、超超超超文字列という結果になっていましたが、超+?文字列だと最小の1文字でのマッチが優先され、3番目の文字でのモノに一致し、超文字列という結果になります。ex10では、?は0文字か1文字に一致しますが、最小なので、一致したとしても0文字が優先され、超文字列という結果ではなく、※4番目の文字からのモノに一致し、文字列という結果になります。英語ではlazyとかnon-greedyといわれていることから、それに対応する日本語として、ものぐさマッチングと呼ばれます。


"[ ~ ]" 大カッコ、ブラケットマーク(羅列検索条件)

"[~]" カッコに囲まれた文字のどれかを検索する
例えば、a,b,c,d,e,f,g,h,i,jのいずれかの文字のどれかがあるか?という検索は
  • ex12:"文字列正規表現検索Regular Expression".match(/[abcdefghij]/)
結果:e ※10番目の文字からのモノに一致し、一致する文字があったという結果になります。


ex12のようにa~jというアルファベットをすべて記述するのではなく[a-j]として省略して記述することができます。


  • ex13:"文字列正規表現検索Regular Expression".match(/[a-j]/)
結果:e ※10番目の文字からのモノに一致し、一致する文字があったという結果になります。


ex13の正規表現検索に対してさらに、大文字の全ても含めることにする場合


  • ex14:"文字列正規表現検索Regular Expression".match(/[a-jA-Z]/)
結果:R ※9番目の文字からのモノに一致し、一致する文字があったという結果になります。ex13では検索結果がeでしたが、その手前にあるRで一致するように変化しています。


"[^ ~ ]" 大カッコ、ブラケットマーク+ハットマーク(羅列検索条件否定)

"[^ ~ ]" カッコに囲まれた文字以外 ^はキャレットとも言います。
例えば、A~Zあるいは、文,字,列,正,規,表,現,検,索,のいずれかの文字以外はあるか?という検索は
  • ex15:"文字列正規表現検索Regular Expression".match(/[^A-Z文字列正規表現検索]/)
結果:e ※10番目の文字からのモノに一致し、初めて登場する小文字として検索に合致します。全角文字全体を対象外にするという検索にする場合はもう少しひねる必要があります。文字コード範囲という指定方法や文字コードにおける最初の文字と終端の文字を使って"-"を使った範囲指定をするという手法です。文字コード種別ごとに異なる手法になるため、範囲指定方法は別の記事にまとめたいと思います。たとえば、Unicodeの全角文字全部のどれか?というのは
  • ex16:"文字列正規表現検索Regular Expression".match(/[々〇〻\u3400-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]/)
結果:文 ※0番目の文字からのモノに一致し、文が最初に登場する全角文字ということになります。
上記手法だけは、一例として示しておきます。
[々〇〻\u3400-\u9FFF\uF900-\uFAFF]→々,〇,〻,\u3400-\u9FFF,\uF900-\uFAFF \uXXXXはユニコード文字番号16進数指定です。
[\uD840-\uD87F][\uDC00-\uDFFF]→ユニコードのサロゲートペアと呼ばれる範囲の4バイト文字範囲です。
説明の意味が分からない人はユニコードの記事で確認してみて下さい。

"|" パイポマーク(or検索条件)

"|" パイポ(パイプ)マークは、記述したうちのどれか?という意味になります。既に一つ前のややこしい議論の結果として使ってしまっています。前述のように文字コード範囲を複数記述する方法としても使えますし、検索文字列を複数記述する手法として"/ ~ /"の中で使えます。
ex17."文字列正規表現検索Regular Expression".match(/Regular|Expression/)
結果:Regular ※9番目の文字のモノです。RegularかExpressionのどちらかという意味になります。先に登場するRegularに一致します。

"{}" 中カッコ、ブレースマーク(直前の文字の繰り返し数指定)

"{}" 中カッコ、ブレースマークは直前の文字の繰り返し数を指定できる検索になります。
ex18."超超超超文字列正規表現検索Regular Expression".match(/超{4}文字列/)
結果:超超超超文字列 ※0番目の文字からのモノに一致し、検索した文字列と一致したという結果になります。


繰り返し文字数を指定できるだけでなく、繰り返し範囲を指定することもできます。範囲指定するには例えば0回以上4回以下という範囲であれば{0,4}という具合にカンマの前に繰り返し範囲の中の小さいほうの数、下限の数、そして、カンマの後ろに繰り返し範囲の大きいほうの数上限の数を記述します。
ex19."超超超超文字列正規表現検索Regular Expression".match(/超{0,4}文字列/)
結果:超超超超文字列 ※0番目の文字からのモノに一致し、検索した文字列と一致したという結果になります。


0回の繰り返しでも一致するので、以下の例では超がなくても一致する結果が得られます。
ex20(1)."文字列正規表現検索Regular Expression".match(/超{0,4}文字列/)
結果:文字列 ※0番目の文字からのモノに一致し、検索した文字列と一致したという結果になります。


上限のない場合の0回以上の繰り返しでも一致するには以下のように"0,"とします。以下の例でも超がなくても一致する結果が得られます。
ex20(2)."文字列正規表現検索Regular Expression".match(/超{0,}文字列/)
結果:文字列 ※0番目の文字からのモノに一致し、検索した文字列と一致したという結果になります。


上限のある場合で10回以内の繰り返しに一致するには以下のように",10"とします。以下の例でも超が11以上あっても10を限度とした一致をする結果が得られます。
ex20(3)."超超超超文字列正規表現検索Regular Expression".match(/超{,2}文字列/)
結果:文字列 ※3番目の文字からのモノに一致し、検索した文字列と一致したという結果になります。

/^ ~ /(先頭文字指定)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、先頭での一致に限られます。"/ ~ /"の検索条件の最初の"/"の直後に"^"を付加して、"/^ ~ /"のようにする必要があります。"[^ ~ ]"のようなブラケット内での”^"はカッコ内に羅列した文字以外という否定でしたが、/^ /の内側の先頭の"^"では、検索対象文字列の先頭に検索文字があるかという意味になっていて混乱しがちですが、意味合いが違うことに気を付けましょう。
  • ex22:"文字列正規表現検索\nRegular Expression文字列".match(/^Regular/)
結果:null ※\nに続く行頭のRegularはありますが、先頭の検索なので、不一致です。行頭での一致を目指すのであれば一行ずつ変数に格納して処理する必要があります。あるいは\nを含めた検索条件を設定する方法もあります。
  • ex23:"文字列正規表現検索\nRegular Expression文字列".match(/^文字列/)
結果:文字列 ※0番目の文字でのモノに一致し、検索の一致があったという結果になります。


/ ~ $/(末尾文字指定)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、末尾での一致に限られます。"/ ~ /"の検索条件の最後のの"/"の直前に"$"を付加して、"/ ~ $/"のようにする必要があります。
  • ex24:"文字列正規表現検索\nRegular Expression文字列".match(/文字列$/)
結果:文字列 ※28番目の文字でのモノに一致し、検索の一致があったという結果になります。一致の結果の意味が0番目にある文字列ではないことに注意が必要です。


/ ~\b/(スペース区切りアリ指定)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、検索文字に続けて\bとついているような場合は文字列先頭あるいは末尾ありは半角スペースで区切られたキーワードであることが検索の条件に加わります。\bは区切りアリ。対して\Bはスペース区切り無しと大文字の場合は区切り条件を否定する意味になります。このような対応の検索オプションはいくつかありますが、基本的に大文字と小文字で相反する意味として対応づけられています。
  • ex25:"文字列正規表現検索(RegularExpression) Regular Expression 文字列".match(/Expression\b/)
結果:文字列 ※37番目の文字でのモノに一致し、検索の一致があったという結果になります。一致の結果の意味が17番目にあるExpressionではないことに注意が必要です。


/ ~\B/(スペース区切りナシ指定)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、検索文字に続けて\Bとついているような場合は文字列先頭あるいは末尾にあって、かつ半角スペースでは区切られていないキーワードであることが検索の条件に加わります。
  • ex26:"文字列正規表現検索(RegularExpression) Regular Expression 文字列".match(/Expression\B/)
結果:文字列 ※17番目の文字でのモノに一致し、検索の一致があったという結果になります。一致の結果の意味が37番目にあるExpressionではないことに注意が必要です。


/\d/(ディジット、数字検索)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、\dは[0-9]と同じことになります。
  • ex27:"文字列正規表現検索Regular Expression2".match(/\d/)
結果:2 ※27番目の文字でのモノに一致し、検索の一致があったという結果になります。


/\D/(ディジット、数字以外検索)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、\Dは[^0-9]と同じことになります。
  • ex28:"2016文字列正規表現検索Regular Expression2".match(/\D/)
結果:文 ※4番目の文字でのモノに一致し、検索の一致があったという結果になります。初めて登場する数字以外の文字に一致しています。


/\w/(ワード、アルファベット/_/数字検索)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、\wは[a-zA-Z_0-9]と同じことになります。
  • ex27:"文字列正規表現検索Regular Expression2".match(/\d/)
結果:R ※9番目の文字でのモノに一致し、検索の一致があったという結果になります。


/\W/(ワード、アルファベット/_/数字以外検索)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、\Wは[^a-zA-Z_0-9]と同じことになります。
  • ex28:"2016文字列正規表現検索Regular Expression2".match(/\D/)
結果:文 ※4番目の文字でのモノに一致し、検索の一致があったという結果になります。初めて登場するアルファベット/_/数字以外の文字に一致しています。


/\s/(スペース、空白文字、制御文字検索)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、\sは[ \u0000-\u001F\u00FF]と同じことになります。
  • ex27:"文字列正規表現検索Regular Expression2".match(/\s/)
結果:" "(半角スペース) ※16番目の文字でのモノに一致し、検索の一致があったという結果になります。


/\S/(スペース、空白文字、制御文字以外検索)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、\Sは[^ \u0000-\u001F\u00FF]と同じことになります。
  • ex28:"2016文字列正規表現検索Regular Expression2".match(/\S/)
結果:文 ※0番目の文字でのモノに一致し、検索の一致があったという結果になります。初めて登場する空白、制御文字以外の文字に一致しています。


/ ~ /i (大文字小文字を区別しない検索)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、/ ~ /i のように記述すると大文字と小文字を区別しない検索になります。
  • ex29:"2016文字列正規表現検索Regular Expression2".match(/regular/i)
結果:Regular ※13番目の文字でのモノに一致し、検索の一致があったという結果になります。


/ ~ /g (すべてを検索、グローバルマッチ)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、/ ~ /g のように記述すると検索対象文字列全体のすべてで検索し、先頭の検索結果が見つかっても、それ以降に登場する検索についても、すべて実施します。検索結果は複数の検索結果が返却されることもあるため、配列要素になって返却されます。
  • ex29:"2016文字列正規表現検索Regular Expression1,Regular Expression2".match(/Regular/g)
結果:Regular ※13番目の文字でのモノと33番目の文字でのモノと一致し、検索の一致があったという結果になります。


/(*)~/ (パターンマッチ 10個まで)

/ ~ / のように"/"で囲まれた部分に書いた文字が検索文字になりますが、/(*)~/ のようにカッコ(パーレンスィスとかパーレンとも言います。)を利用すると、()に相当する部分をパターンとして記憶するような動作が起こります。具体的には例を見た方がわかりやすいと思います。
  • ex30:"超超超超超文字列正規表現検索Regular Expression1,Regular Expression2".match(/(*)文字列(*)/)
結果:超超超超文字列 ※0番目の文字でのモノと33番目の文字でのモノと一致し、検索の一致があったという結果になります。これだけだと通常の検索と何も変わらないように思えますが、$1という変数のような記号に対して最初の()内で一致したパターンの文字が格納されます。
$1 = 超超超超超
$2 = 正規表現検索Regular Expression1,Regular Expression2
という具合に2つ目以降のパターンも同様にして格納されます。




個人用ツール
名前空間

変種
操作
案内
ツールボックス