ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示
ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示

2012年12月27日木曜日

◆特定の場所で文字列を分割(文字を削らない)

正規表現に詳しい方には常識かもしれないが以下のパターンは使いでがありそうなのでメモしておく。

Splitting Texts without Losing Anything - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

PS>$profile
F:\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

PS>$profile -split '\\'
F:
Documents
WindowsPowerShell
Microsoft.PowerShell_profile.ps1

PS>$profile -split '(?<=\\)'
F:\
Documents\
WindowsPowerShell\
Microsoft.PowerShell_profile.ps1

PS>$profile -split '(?=\\)'
F:
\Documents
\WindowsPowerShell
\Microsoft.PowerShell_profile.ps1

最初の例では分割文字に「\」を指定しているのでそれが削られたうえで分割される。

場合によっては「\」を削らずに分割したい場合があるでしょうというのが、この話の趣旨。

「\」の右側で分割するか左側で分割するかの2パターン。
これは「\」を先頭から検索するか後ろから検索するかで切り分けが可能。

ここら辺の正規表現の説明は以下を参照。
PowerShell: ◆正規表現の基礎<グループ化構成体>

2011年12月29日木曜日

◆正規表現の基礎<アトミックゼロ幅アサーション>

<アトミックゼロ幅アサーション>

なんか難しい言葉ですが、要はパターンがどのような場所で一致するかを表す指定のようです。


^

文字列の先頭。複数行オプションが有効の場合は行の先頭。

PS>"abc`ndef" -match '^ab'
True
PS>"abc`ndef" -match '^de'
False
PS>"abc`ndef" -match '(?m:^de)'
True


$

文字列の末尾。複数行オプションが有効の場合は行の末尾。

PS>"abc`ndef" -match 'ef$'
True
PS>"abc`ndef" -match 'bc$'
False
PS>"abc`ndef" -match '(?m:bc$)'
True


\A

文字列の先頭でマッチ。 

PS>"abc`ndef" -match '\Aab'
True
PS>"abc`ndef" -match '(?m:\Ade)'
False

 


\Z

文字列の末尾または末尾の改行の前でマッチ。

PS>"abc`ndef" -match 'ef\Z'
True
PS>"abc`ndef" -match '(?m:bc\Z)'
False

 


\z

文字列の末尾でマッチ。

PS>"abcde`n" -match 'de\Z'
True
PS>"abcde`n" -match 'de\z'
False
PS>"abcde" -match 'de\z'
True


\G

先頭から最後まで指定したパターンの連続を表す指定のようです。
マッチしない箇所が出てきたらそこで終わり。
「Match」クラスなどを使って連続してパターンを検索するのに使用する。
以下はMSDNに載っていたサンプルをPowerShellに変換したものです。

連続マッチのサンプル
  1. $str = "capybara,squirrel,chipmunk,porcupin,gopher," +
  2.          "beaver,groundhog,hamster,guinea pig,gerbil," +
  3.          "chinchilla,prairie dog,mouse,rat"
  4. $pattern = '(\G\w+\s?\w*),?'
  5. $match = [Regex]::Match($str, $pattern)
  6. while ($match.Success)
  7. {
  8.     $match.Groups[1].Value
  9.     $match = $match.NextMatch()
  10. }

0または1個のカンマで区切られたワード文字(間にスペースが1つ有っても良い)を検索するパターン。ループしてマッチするものをすべて見つける。
image

途中でマッチしない箇所があるとそこで終了します。

  1. $str = "capybara,squirrel,chipmunk,porcupin,-gopher," +

image

\Gの指定がないときはマッチしない箇所は飛ばして最後まで継続します。


\b

ワード境界でのマッチ。

PS>"Power-Shell(V2)" -match '\bShe'
True
PS>"Power-Shell(V2)" -match '\bhe'
False
PS>"Power-Shell(V2)" -match 'hell\b'
True
PS>"Power-Shell(V2)" -match '\bhell'
False


\B

ワード境界以外でのマッチ。

PS>"Power-Shell(V2)" -match '\BShe'
False
PS>"Power-Shell(V2)" -match '\Bhe'
True

2011年12月23日金曜日

◆正規表現の基礎<グループ化構成体>

はっきり言ってちょっと手に余ってきた。(笑)
あくまでも自分なりの解釈をまとめたメモと言う事で・・・。

<グループ化構成体>

(subexpression)

正規表現の部分式を表し、通常は入力文字列の部分文字列をキャプチャする。
括弧で囲まれた部分を、$matches[1]から順に、括弧の数だけ順にキャプチャしてくれる。マッチ全体は$matches[0]となる。

PS>"PowerShell" -match '(S.e)ll';$matches[0,1]
True
Shell
She

‘S.ell’は’Shell’にマッチするので$matches[0]は’Shell’
S.e の部分は括弧で囲まれているのでその部分が$matches[1]となっている。

括弧を2つ使うとこんな感じ。

PS>"PowerShell" -match '(o.e)r(S.e)ll';$matches
True

Name                           Value
----                           -----
2                              She
1                              owe
0                              owerShell

括弧は入れ子にしても使える。

PS>"PowerShell" -match '(o.er(S.e))ll';$matches
True

Name                           Value
----                           -----
2                              She
1                              owerShe
0                              owerShell

 

(?<name>subexpression)

キャプチャした部分式に名前を指定できる。

PS>"PowerShell" -match '(?<first>o.e)r(?<second>S.e)ll';$matches
True

Name                           Value
----                           -----
second                         She
first                          owe
0                              owerShell


PS>$matches.second
She

 

(?<name1-name2>subexpression)

グループ定義を均等化する。

果たして何のことやら。\(ー_ー;)/

どうやらこの機能は.Net独自の機能っぽい。
そのせいかまともに使い方を説明している資料が全く見つけられない。
MSの資料は何を言っているのか全く理解出来ないし・・・。
まぁ、知らなくて困ることはなさそうだ。
一応MSの解説をそのまま載せておく。
グループ化構成体

(?< name1 - name2 > subexpression)

グループ定義を均等化します。既に定義されていたグループ name2 の定義を削除し、既に定義されていた name2 グループと現在のグループの間隔をグループ name1 に格納します。グループ name2 が定義されていない場合、一致はバックトラックされます。name2 の最後の定義を削除すると、name2 の以前の定義がわかるため、この構成体によって、かっこなど入れ子になった構成体を追跡するカウンタとして name2 グループのキャプチャのスタックを使用できます。この構成体では、name1 は省略できます。たとえば (?'name1-name2') のように、山かっこの代わりに一重引用符を使用することもできます。

詳細については、このトピックの「」を参照してください

 

(?:subexpression)

キャプチャを抑止する。

PS>"abcd" -match '((b|a)c)d';$matches
True

Name                           Value
----                           -----
2                              b
1                              bc
0                              bcd


PS>"abcd" -match '((?:b|a)c)d';$matches
True

Name                           Value
----                           -----
1                              bc
0                              bcd

キャプチャしたくないだけであれば括弧を付けなければ良いだけだと思うが、おそらく他の意味での括弧を使いたい場合なのだろう。(ちなみに|は、またはの意)

(?imnsx-imnsx:subexpression)

(?imnsx-imnsx)subexpressionと書いても良いのかな・・・。

指定したオプションを部分式に適用または無効にする。
オプションは以下のとおり。

RegexOption のメンバ インライン文字 説明

None

なし

オプションを設定しないことを指定します。

IgnoreCase

i

大文字小文字を区別せずに照合を行うことを指定します。

Multiline

m

複数行モードを指定します。^ および $ の意味を変更し、文字列の先頭および末尾ではなく、それぞれ、行の先頭および末尾と一致するようにします。

ExplicitCapture

n

(?<name>…) の形式で明示的に名前付けまたは番号付けしたグループだけを有効なキャプチャにするように指定します。これによって、(?:…) という扱いにくい構文を使用せずに、キャプチャしないグループ化を行うときに、かっこを使用できます。

Singleline

s

単一行モードを指定します。ピリオド文字 (.) の意味を変更し、\n 以外のすべての文字ではなく、すべての文字と一致するようにします。

IgnorePatternWhitespace

x

エスケープされない空白をパターンから除外し、シャープ記号 (#) の後ろのコメントを有効にするように指定します。エスケープされる空白文字の一覧については、「文字のエスケープ」を参照してください。文字クラスからは空白が削除されません。

<IgnoreCase>

matchはそもそも大文字小文字を区別しないのでここではその効果を見るためにcmatchを使っている。

PS>"abc" -cmatch 'AB'
False
PS>"abc" -cmatch '(?i:AB)'
True

<Multiline>

^は入力文字列の先頭を表すので2行目以降にはマッチしない。
Multilineオプションを付けることで入力文字列の先頭ではなく行頭の意味に変化する。

PS>"ab`ncd"
ab
cd
PS>"ab`ncd" -match 'ab'
True
PS>"ab`ncd" -match 'cd'
True
PS>"ab`ncd" -match '^ab'
True
PS>"ab`ncd" -match '^cd'
False
PS>"ab`ncd" -match '(?m:^cd)'
True

<ExplicitCapture>

名前付したグループだけをキャプチャする。

PS>"bcd" -match '(a|b)cd';$matches
True

Name                           Value
----                           -----
1                              b
0                              bcd


PS>"bcd" -match '(?n:a|b)cd';$matches
True

Name                           Value
----                           -----
0                              bcd

match演算子では(?:)との違いは見出しづらいように思う。
RegExクラスの様に通常のオプションとインラインでのオプションの両方が使える場合に意味が出てくるのでは無いだろうか・・・・。

<Singleline>

通常ピリオドは改行以外のすべての文字にマッチするが、Singlelineオプションをつけると改行にもマッチする。

PS>"ab`ncd" -match 'a.*d'
False
PS>"ab`ncd" -match '(?s:a.*d)'
True

<IgnorePatternWhitespace>

パターンの中のスペースを無視する。

PS>"abcde" -match "ab cd"
False
PS>"abcde" -match "(?x:ab cd)"
True

加えて、#以降行末までをコメントとして扱ってくれるようになる。
とあるが、これがちょっと分かりづらく以下のような指定ではエラーになる。

PS>"abcd" -match '(?x:ab cd-#コメント)'
演算子 '-match ' の引数 解析中 "(?x:ab cd-#コメント)" - ) が足りません。 が正しくありません。
発生場所 行:1 文字:14
+ "abcd" -match <<<<  '(?x:ab cd-#コメント)'
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : BadOperatorArgument

試行錯誤した結果、どうやら行末が必要なようです。
こんな感じ。

PS>"abcd" -match '(?x:ab cd#コメント
>> )'
>>
True
PS>"abcde" -match '(?x:ab cd#コメント
>> e)'
>>
True

実際には、ヒア文字列とかの行末にコメントを付けるときなどに使うのかと思います。

<マイナス付きオプション>

これまでのオプションはそれぞれマイナスが付いた指定もできて、打ち消しの意味になります。
RegExオプションとインラインで相反する指定をする時に有効なものかと思いますのでRegExを使ったサンプルを1つ。

インラインでオプションを打ち消すサンプル
  1. $opt = [System.Text.RegularExpressions.RegexOptions]
  2. $opt_x = $opt::IgnorePatternWhitespace
  3. $opt_i = $opt::IgnoreCase
  4.  
  5. "(1)"
  6. [RegEx]::Match("abcde","aBc De",$opt_x -bor $opt_i)
  7. "(2)"
  8. [RegEx]::Match("abcde","(?-i-x:aBc De)",$opt_x -bor $opt_i)
  9. "(3)"
  10. [RegEx]::Match("abcde","(?-i-x:aBcDe)",$opt_x -bor $opt_i)
  11. "(4)"
  12. [RegEx]::Match("abcde","(?-i-x:abcde)",$opt_x -bor $opt_i)

結果はこんな感じ。
image

(1)は「スペースを無視する」と「大文字小文字を区別しない」オプションが付いているのでマッチ。
(2)と(3)はそれをインラインで打ち消しているのでアンマッチ。
結局スペースを削除し、大文字小文字をあわせて、(4)でマッチとなっている。

(?=subexpression)

ゼロ幅の正の先読みアサーション。
なんのこっちゃ(笑)

自分なりに解釈すると、このsubexpressionはマッチ条件には使われるがキャプチャはされないものって感じかなぁ。先読みってのは右側ってことかな。

PS>"12345-6789" -match '(?=...-)..';$matches
True

Name                           Value
----                           -----
0                              34

(?=...-)は、345- とマッチするので3が実際のパターンの判定開始位置。
単純に任意の2文字をパターン指定しているので3から2文字、即ち34がキャプチャされている。

PS>"123a456b789c" -match  '\d{3}(?=c)';$matches
True

Name                           Value
----                           -----
0                              789

こちらは、後ろに「c」の文字が続く数字3桁という事で789がキャプチャされている。

(?!subexpression)

ゼロ幅の負の先読みアサーション。
上記の否定形。

PS>"123c456b789a" -match  '\d{3}(?!c)';$matches
True

Name                           Value
----                           -----
0                              456

後ろに「c」の続かない数字3桁という事で456がキャプチャされている。

(?<=subexpression)

ゼロ幅の負の先読みアサーション。
今度は負なので左側。

PS>"public static int  private static string" -match '(?<=private )static.*';$matches
True

Name                           Value
----                           -----
0                              static string

頭に「private」が付いた「static」という事で「string」のほうがマッチ。

(?<!subexpression)

上記の否定形。

(?>subexpression)

MSDNによると、

(?> subexpression)

非バックトラッキング部分式です。"最長" 部分式とも呼ばれます。部分式は 1 回完全に一致し、バックトラッキングの断片には参加しません。つまり、部分式は、その部分式単独で一致する文字列にだけ一致します。

既定では、一致しなかった場合に、バックトラッキングによって他の一致が検索されます。バックトラッキングが成功しないことがわかっている場合は、非バックトラッキング部分式を使用して不要な検索を回避し、パフォーマンスを高めることができます。

果たして何のことやら。\(ー_ー;)/

っとパスしようかと思ったのだが、なんとか自分なりに適当に纏めてみた。

基本的に量指定子「*」、「+」のように長さの決まっていないものについては最長(一番広い範囲)でのマッチが採用される。
以下の例ではpencilではなくpenとマッチしているのが判る。

PS>"This is not a pencil. This is a pen." -match '(This.+pen)';$matches
True

Name                           Value
----                           -----
1                              This is not a pencil. This is a pen
0                              This is not a pencil. This is a pen

次に、パターン文字列の後ろにcilを追加してみる。

PS>"This is not a pencil. This is a pen." -match '(This.+pen)cil';$matches
True

Name                           Value
----                           -----
1                              This is not a pen
0                              This is not a pencil

今度は当然「pencil」にマッチするわけであるが、部分式は前回と同じなのでまずは、「pen」とマッチする。
しかし、「cil」が見つからないのでそこから範囲を狭めてというか左側に向かって次のpenを探すという段階を踏むことになる。(この動作をバックトラッキングと呼ぶのだと思う)

さて、ここで以下のようなスクリプトがあったとすると、

正規表現でフィルターするサンプル
  1. $arr = ,"This is not a pen.  This is a ballpint pen"
  2. $arr += "This is not a pen. This is a pencil"
  3. $arr += "This is not a pen. This is a highlighter pen"
  4. $arr += "This is not a pen. This is a pencil"
  5. $arr += "This is not a pen. This is a highlighter pen"
  6.  
  7. $arr | ?{$_ -match '(This.+pen)cil'}

これは明らかに以下のように書いても同じ結果が得られる。

  1. $arr | ?{$_ -match '(?>This.+pen)cil'}

このように明らかにバックトラッキングが不要な局面では非バックトラッキング指定をしたほうが性能的に有利ということなのだと思う。

対象の文字列を大きくして性能を比較してみたのが以下のサンプルである。

バックトラッキングあり
  1. $arr = ,"This is not a pen.  This is a ballpint pen"
  2. $arr += "This is not a pen. This is a pencil"
  3. $arr += "This is not a pen. This is a highlighter pen"
  4. $arr += "This is not a pen. This is a pencil"
  5. $arr += "This is not a pen." + ("hoge" * 10000) +
  6.     " This is a highlighter pen"
  7.  
  8. $arrLarge = $arr * 1000
  9. Measure-Command{
  10.     $arrLarge | ?{$_ -match '(This.+pen)cil'} | Out-Null
  11. }

image
バックトラッキング無し
  1. $arr = ,"This is not a pen.  This is a ballpint pen"
  2. $arr += "This is not a pen. This is a pencil"
  3. $arr += "This is not a pen. This is a highlighter pen"
  4. $arr += "This is not a pen. This is a pencil"
  5. $arr += "This is not a pen." + ("hoge" * 10000) +
  6.     " This is a highlighter pen"
  7.  
  8. $arrLarge = $arr * 1000
  9. Measure-Command{
  10.     $arrLarge | ?{$_ -match '(?>This.+pen)cil'} | Out-Null
  11. }

image

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

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

2011年11月23日水曜日

◆正規表現の基礎<文字クラス>

これまで正規表現については必要になった都度に適当に調べて適当に使っていた。
.NETではあまり文字列を扱うようなプログラムを組む機会が多くなかった。
しかし、Powershellを使うようになってから何かと必要に迫られることが多くなってきたので、ここはひとつ基本的な所は勉強してみようと思い立った。Powershellは後発の為かあまり正規表現について詳しく解説しているサイトが見当たらない。仕方がないので他の言語で説明しているサイトを参考にしながら地道に試していこうと思う。
まずは文字クラスから。

<文字クラス>


.(ピリオド)


改行文字(\n)以外の任意の一文字。(ただし [] 内ではピリオド文字。)
「.」
「」内に任意の1文字がある箇所にマッチ

PS>"Powershell" -match "Power.hell"
True
PS>"Powershell" -match "Power..hell"
False
PS>"Powershellよ" -match "Power.hell"
True
PS>"" -match ".*"
True
PS>" " -match "."
True
PS>"A.A" -match "A\.A"
True

*は直前文字の0回以上の繰り返しなので空文字にもマッチしてしまう。
ピリオド自体を表すには直前に¥をつけてエスケープする。
 


[characters]

[ ] 内の任意の文字。

PS>"abc" –match '[cde]'
True
PS>"abc" –match '[def]'
False

 


[^characters]

[ ] 内の任意の文字以外の文字。

PS>"abc" -match '[^cab]'
False
PS>"abcd" -match '[^cab]'
True

 


[開始文字-終了文字]

開始文字から終了文字の範囲内にある文字。複数のセットを繋げて指定もできる。

PS>"c" -match '[a-d]'
True
PS>"c" -match '[c-d]'
True
PS>"c" -match '[d-z]'
False
PS>"C" -match '[c-d]'
True
PS>"f" -match '[c-de-g]'
True

 


[^開始文字-終了文字]

開始文字から終了文字の範囲外にある文字。

PS>"abc" -match '[^cab]'
False
PS>"abcd" -match '[^cab]'
True

 


\p{文字クラス}

文字クラスにはUNICODEに対して付けられているカテゴリー名、もしくはグループ名を指定する。
カテゴリー名とグループ名については以下のMicrosoftのサイト(の下の方)に記載されている。

文字クラス

実際にマッチする文字は、カテゴリブロックを参照。

ちなみに、「Lu」は大文字のキャラクタと説明があるのだが、Powershell(というか.NET?)では小文字もマッチするようだ。
image

PS>"a" -match '\p{Lu}'
True
PS>"aA(カ山" -match '\p{IsHiragana}'
False
PS>"あ" -match '\p{IsHiragana}'
True

<補足・訂正>
おもいっきり間違っていました。
大文字小文字を区別する場合は-matchではなく-cmatchを使うとのご指摘を頂きました。(cが付く演算子は幾つかあるが、matchにcが付くのは知りませんでした。というかHELPには載っていないような・・・)

ということでサンプルを修正しました。

PS>"a" -cmatch '\p{Lu}'
False
PS>"A" -cmatch '\p{Lu}'
True
PS>"あア亜" -match '\p{IsHiragana}';$matches[0]
True

PS>"あア亜" -match '\p{IsKatakana}';$matches[0]
True

PS>"あア亜" -match '\p{IsCJKUnifiedIdeographs}';$matches[0]
True

 


\P{文字クラス}

\p{文字クラス}の否定形。


\w

任意のワード文字。
ワード文字とは英数字とアンダーバーを指し、[a-zA-Z_0-9]と同義。

PS>"()=~|{`@}*+?" -match '\w'
False
PS>"a" -match '\w'
True
PS>"A" -match '\w'
True
PS>"_" -match '\w'
True


\W

非ワード文字。


\s

空白文字。
空白文字とは、タブ、スペース(全角含む)、改行
(厳密にはまだあるみたいだが、普通に使うのはこんなところ?)

PS>" " -match '\s'
True
PS>"`t" -match '\s'
True
PS>"`r" -match '\s'
True
PS>"`n" -match '\s'
True
PS>" " -match '\s'
True
PS>"A" -match '\s'
False
PS>"aあア([\9" -match '\s'
False


\S

空白文字以外。


\d

0から9までの数字(全角を含む)

PS>@(0..9;65296..65305 | %{[char]$_};"A","B") | %{"`n対象文字 match"}{Write-Host $_ `t ($_ -match '\d')}

image


\D

数字以外。