2010年10月12日火曜日

Java 正規表現

忘備録

  * : 0回以上の繰り返し

  + : 1回以上の繰り返し

  ? : 0回 or 1回

  . : 任意の1文字

  ^ : 先頭

  $ : 終端

  [^] : 文字クラスの否定


・エスケープ文字

  \ * + . ? { } ( ) [ ] ^ $ - |


・エスケープ文字をパターン入れるときは、エスケープ処理が必要

  \\( \\{ \\$ \\|


・パターン文字列には、エスケープシーケンスをいれることが可能

\0n8 進値 0n を持つ文字 (0 <= n <= 7)
\0nn8 進値 0nn を持つ文字 (0 <= n <= 7)
\0mnn8 進値 0mnn を持つ文字 (0 <= m <= 3、0 <= n <= 7)
\xhh16 進値 0xhh を持つ文字
\uhhhh   16 進値 0xhhhh を持つ文字
\tタブ文字 ('\u0009')
\n改行文字 ('\u000A')
\rキャリッジリターン文字 ('\u000D')
\f用紙送り文字 ('\u000C')
\a警告 (ベル) 文字 ('\u0007')
\eエスケープ文字 ('\u001B')
\cxx に対応する制御文字





こんな感じで使う


String in = "<input type=\"hidden"\ name=\"hoge1\" value=\"hogehoge11\">"
+ "<input type=\"hidden"\ name=hoge2 value=hogehoge22>"
+ "<input type=\"hidden"\ NAME=\"hoge3\" VALUE=\"hogehoge33\">";


int flags = Pattern.CASE_INSENSITIVE | Pattern.MULTILINE;
Pattern ptn = Pattern.compile("<input.* name=\"?([^\"]*)\"? value=\"?([^\"]*)\"?>", flags);

Matcher mt = ptn.matcher(in);
while (mt.find()) {
System.out.println(mt.groupCount());
String name = mt.group(1);
System.out.println(name);
String value = mt.group(2);
System.out.println(value);
}


() で括った部分が mt.group(n) で取り出せる。
mt.group(0) には全体が入っていて、最初の () 部分は mt.group(1) に入る。


 

0 件のコメント:

コメントを投稿