スクリプト内では、正規表現を使用することができます。
以下にスクリプトでの正規表現について説明します。
正規表現の記号
記号 | 説明 | 使用例 |
---|---|---|
. | 任意の1文字に一致する。 | 文字列中に「ABC」で始まる4文字の文字列があるか検査する。 regexp {ABC.} $text |
* | 直前のパターン要素の、0回以上の繰り返しに一致する。 | 文字列中に「<」と「>」で囲まれた部分があるか検査する。(囲まれた中は空文字でも可) regexp {<.*>} $text |
+ | 直前のパターン要素の、1回以上の繰り返しに一致する。 | 文字列中に「<」と「>」で囲まれた文字があるか検査する。(囲まれた中に任意の文字が1文字以上あること) regexp {<.+>} $text |
? | 直前のパターン要素の0回、または1回の出現に一致する。 | 文字列中に「1」、または「01」があるか検査する。 regexp {0?1} $text |
( ) | サブパターンをグループ化する。 繰り返しや選択は、サブパターン全体に適用される。 | 文字列中にカンマがあるか検査し、ある場合は一致部分すべてをallに、カンマの前後をそれぞれsub1,sub2に切り出す。(カンマの前後は空文字列でも可) regexp {(.*),(.*)} $text all sub1 sub2 |
| | 選択 | 文字列中に「Info」、または「Warning」が含まれるか検査する。 regexp {Info|Warning} $text |
[ ] | 文字集合に含まれる文字に一致する。 ただし、最初の文字が「^」(ハット)の場合は、文字集合に含まれない文字に一致する。範囲は[a-z]のように「-」(ハイフン)を入れる。 | 文字列中にABCに続く2桁の数字があり、さらにその直後が空白以外か検査する。 regexp {ABC[0-9][0-9][^ ]} $text |
^ | パターンの先頭に指定された場合、文字列の先頭に一致する。 | 文字列の先頭が「ABC」か検査する。 regexp {^ABC} $text |
$ | パターンの末尾に指定された場合、文字列の末尾に一致する。 | 文字列の末尾がABCか検査する。 regexp {ABC$} $text |
パターン検索の規則
パターンと一致した最初で最長の文字列が選択されます。
「|」(選択)が含まれる場合は、左側のサブパターンから検査されます。
「*」、「+」、「?」を使用した表現では、一致する部分が長い文字列が優先されます。
複数の部分表現が並んでいる場合は、左側の部分表現から検索します。
特殊文字と正規表現記号の扱い
正規表現記号のうち、スクリプト上の特殊文字に当たるものがあるため、使用する場合には以下のように記述してください。
スクリプト上の特殊文字
「[」、「]」、「$」、「(」、「)」、「{」、「}」
特殊文字の使用方法
以下のどちらかの方法で記述します。
前に「\」(円記号)を付けてエスケープする
正規表現全体を「{ }」(中括弧)で囲む
例)
regexpの引数に正規表現の「[0-9]」を指定します。
regexp "\[0-9\]" $text
または、
regexp {[0-9]} $text
正規表現記号を正規表現の中で、単なる文字として扱う場合は、「\」(円記号)を直前に付加してください。
ただし、円記号はスクリプトとしての特殊文字でもあるため、記述する際には「\\」とするか正規表現全体を中括弧で囲む必要があります。
例1)
文字「*」を含んでいるかを検査します。
regexp "\\*" $text
または、
regexp {\*} $text
例2)
文字「[」を含んでいるかを検査します。
regexp "\\\[" $text
または、
regexp {\[} $text
これに伴い、正規表現の中で円記号自身を単なる文字として扱う場合は、「\\」と記述する必要があります。
この場合も、円記号がスクリプトとしての特殊文字を考慮し、2つの円記号それぞれを「\\」とするか、正規表現全体を中括弧で囲む必要があります。
例3)
文字「\」を含んでいるかを検査します。
regexp "\\\\" $text
または、
regexp {\\} $text
スクリプトの特殊文字を、円記号でエスケープすると、例2、3のように複数の円記号が必要になります。
このとき、円記号の記述を間違いやすいので、正規表現の記述は常に中括弧で囲むことを推奨します。
ポイント
文字列の切り出し
文字列を切り出すには[^ ]を組み合わせて記述します。
文字列「A<BC>D」から「< >」で括られている「BC」部分を変数Var0に切り出す場合、以下のように記述します。
regexp {<([^>]*)} "A<BC>D" All Var0
文字列「A[BC]D」から「[ ]」で括られている「BC」部分を切り出す場合、特殊記号の「[ ]」の直前に円記号「\」を付加してエスケープします。
regexp {\[([^\]]*)} "A\[BC\]D" All Var0
正規表現の一般的な文法エラーについて
正規表現の一般的な文法エラーとその対処法の例を示します。
couldn't compile regular expression pattern: parentheses () not balanced
正規表現の記述内で括弧「( )」の対応が取れていません。開き括弧や閉じ括弧の記述などが漏れていないか確認してください。括弧「( )」を通常文字として扱う場合は、「\」(円記号)を付けてエスケープしてください。
couldn't compile regular expression pattern: brackets [] not balanced
正規表現の記述内で大括弧「[ ]」の対応が取れていません。開き大括弧や閉じ大括弧の記述などが漏れていないか確認してください。大括弧「[ ]」を通常文字として扱う場合は、「\」(円記号)を付けてエスケープしてください。
couldn't compile regular expression pattern: invalid character range
文字集合の範囲の指定に誤りがあります。大括弧「[ ]」で囲まれた部分の記述に誤りがないか確認してください。文字集合の範囲を指定する場合は、[0-9]、[a-z]などのように順序が先の文字から後の文字を指定するようにしてください。
couldn't compile regular expression pattern: quantifier operand invalid
正規表現の記号の使用方法に誤りがないか確認してください。
注意事項
正規表現では空白も1文字として認識するため、正規表現中に不要な空白があると、正しく検査できません。また、全角と半角は区別します。