選択 '|' の書き方
'|'を使った選択の書き方や混乱しやすい文字の範囲[.....]との違いを整理します。
範囲の指定[....]
文字の範囲表現の例を示します
/[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;//要らない