2011年11月28日月曜日

◆正規表現の基礎<量指定子>

<量指定子>

*

0回以上のマッチ。(最長マッチ)

PS>"abc" -match "a*";$matches[0]
True
a
PS>"aaaaabc" -match "a*";$matches[0]
True
aaaaa
PS>"baaaaabc" -match "a*";$matches[0]
True

PS>"bbc" -match "a*";$matches[0]
True

*は直前文字の0回以上の繰り返しなので基本的には何でもマッチしてしまう。
これだけだと「*」の存在価値が見えてこないのでMSDNのサンプルをちょっと調べてみた。

PS>"92" -match "91*";$matches[0]
True
9
PS>"91" -match "91*\b";$matches[0]
True
91
PS>"92" -match "91*\b";$matches[0]
False

はっきり言って正規表現初心者の私には難しい内容だが、
最初の例は「1」はあってもなくても良いので「9」がマッチ。
2番目の例(\bはワード境界で終わっている指定)は「91」がマッチ。
っで、3番目だが、「1」自体はあってもなくても良いのだが無いとなると結果的に「9」が終端になっていなければいけない、という事でFalseになるという事と解釈した。

ちなみに、最長マッチというのは、”aaa” –match “a*”としたときに、「a」、「aa」、「aaa」とマッチする中の一番長い「aaa」とのマッチを採用しますってことでしょう。


1回以上のマッチ。(最長マッチ)

PS>"aabbcc" -match 'b+';$matches[0]
True
bb
PS>"aabbccbbb" -match 'b+';$matches[0]
True
bb
PS>"aabbccbbb" -match 'aab+';$matches[0]
True
aabb
PS>"aabbccbbb" -match 'd+';$matches[0]
False

 


?

0回または1回のマッチ。(最長マッチ)

PS>"ba" -match 'a?';$matches[0]
True

PS>"aa" -match 'a?';$matches[0]
True
a

PS>"第1章" -match '第\d\d?章'
True
PS>"第10章" -match '第\d\d?章'
True
PS>"第1a章" -match '第\d\d?章'
False
PS>"第章" -match '第\d\d?章'
False

?も*と同じく0回も含むので、後ろにパターンが続くときに使うケースが多いのかと思う。


{n}

n回のマッチ。

PS>"abba" -match 'ab{2}';$matches[0]
True
abb


{n,}

n回以上のマッチ。 (最長マッチ)

PS>"abbba" -match 'ab{2,}';$matches[0]
True
abbb


{n,m}

n回以上m回以下のマッチ。(最長マッチ)

PS>"abbbba" -match 'ab{1,3}';$matches[0]
True
abbb


?

これまでの量指定子の後ろに付加して最短マッチを表す。

*?,+?,??,{n,}?,{n,m}?

PS>"abbcd" -match 'ab*';$matches[0]
True
abb
PS>"abbcd" -match 'ab*?';$matches[0]
True
a

PS>"abbcd" -match 'ab+';$matches[0]
True
abb
PS>"abbcd" -match 'ab+?';$matches[0]
True
ab

PS>"abbcd" -match 'ab?';$matches[0]
True
ab
PS>"abbcd" -match 'ab??';$matches[0]
True
a

PS>"abbcd" -match 'ab{1,}';$matches[0]
True
abb
PS>"abbcd" -match 'ab{1,}?';$matches[0]
True
ab

PS>"abbbba" -match 'ab{1,3}';$matches[0]
True
abbb
PS>"abbbba" -match 'ab{1,3}?';$matches[0]
True
ab

??などは今ひとつ使い所がピンと来ないが意味合い的には難しくない。

最小マッチのサンプルとして以前、PowerShell: ◆Split演算子で書いたサンプルをそのまま載せておく。

PS>gc "C:\Documents and Settings\minminnana\デスクトップ\test.txt" |
tee-Variable str
<html>
<h1>見出し1</h1>
<h2>見出し2</h2>
</html>
PS>$str -split "<.*?>" | %{if($_ -ne ""){$_}}
見出し1
見出し2

最短マッチの指定をしないと行の先頭の”<”と最後の”>”にマッチして行全体が区切り文字と認識されてしまう。

0 件のコメント:

コメントを投稿