LoginSignup
1
1

正規表現備忘録 選択'|'

Last updated at Posted at 2024-04-12

選択 '|' の書き方

'|'を使った選択の書き方や混乱しやすい文字の範囲[.....]との違いを整理します。

範囲の指定[....]

文字の範囲表現の例を示します

/[a-jvx#$%]/; //aからjまでとv,x,#,$,%のいずれか1文字
/[0-9a-zA-Z\s]/; //大文字、小文字、数字とスペースのいずれか1文字 
/[\s\S]/; //改行文字を含むいずれかの1文字とマッチする
/[^!-~ ];//ASCIIコードと半角スペース以外のいずれか1文字(日本語もマッチする)

細かい範囲の指定はASCIIコード表を参考にする。

サブパターンを使う

red,green,blueいずれかの後に任意の数値が続く箇所をマッチさせたい。

>s = "ssddred3333sss" //ここではred3333をマッチさせたい

サブパターンは[...]に使えない

これは不可

>s.match([(?:red)(?:greeen)(?:blue)]\d+); 
// 文字()?:redgnbluのいずれか1文字にマッチするだけ 

正確なサブパターンの使用

>s.match(/red|green|blue\d+/) //不可 red,green,blue数字としかマッチしない。 
>s.match(/red|green|(?:blue)\d+/) //不可 
//前の結果と同じ(括弧で括っても選択の終了にはならない)
// 正しくマッチさせるには 
>s.match(/(?:red|green|blue)\d+/ //可 red333にマッチする

選択の優先順位

文s内の全てのrubyタグで囲まれた全体と、htmlタグ、タグ終端にマッチさせる。

>s = 'dedede<ruby>frfrfr<rt>gtgtgt</rt></ruby>swswswdedede<h1 class ="xx">frfrfr</h1>gtgtgt<img src="dededef">rfrfrhyhyhy';
>reg = /(?:<ruby>.*?<rt>.*?<\/rt><\/ruby>|<.+?>)/g;
>s.match(reg);
//ruby>frfrfr<rt>gtgtgt</rt></ruby>,<h1 class ="xx">,</h1>,<img src=dededef>にマッチする
//マッチは<ruby>,<rt>,</rt>,</ruby>,<h1 class ="xx">,</h1>,<img src=dededef>にはならない

'|'の左側ほど優先順位が高い。 この場合’<ruby>...</ruby>の部分は選択の1番目と2番目のどちらにもマッチするが選択左側の<ruby>..</ruby>にマッチする。
'|'右側のタグ(<.+?>)にマッチすることを避けるために、次のように先読み言明を利用する必要は無い。

reg = /(?:<ruby>.*?<rt>.*?<\/rt><\/ruby>|<(?!\/?ruby|\/?rt).+?>)/g;//要らない
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1