0

グループを返すための単純な正規表現を見つけるのに多くの時間を費やしました(最初のグループのみ)。

したがって、文字列は「購入不要」または「50.00 ドル相当の食料品の購入が必要」のいずれかになります。

指定された文字列に基づいて「いいえ」または「50」を解析できる正規表現を作成しようとしています。

これは私が書いたものです。

(?:(No) monthly maintenance|Purchase of \$([\d\.]+ worth groceries)

これは正常に機能しますが、出力を最初のグループ/グループ 1 のみにしたいと考えています。

4

3 に答える 3

2

を使用しないのはなぜですか/(?:No monthly maintenance|Purchase of $([0-9.]+) worth groceries)/

これらの形式のいずれでもない場合、一致は失敗し、グループ 1''は「毎月のメンテナンスなし」の場合に一致し、それ以外の場合は番号に一致します。

文字列または数値をキャプチャする必要がある場合はNo、もう少し複雑にして、次のようにする必要があります。

/(?:Purchase of $)?([0-9.]+|No) (?:monthly maintenance|worth groceries)/
于 2010-04-19T21:47:35.753 に答える
1

ほとんどの言語は、非キャプチャグループ((?:...|...))にあるかどうかに関係なく、一致するグループを順番にカウントするため、興味深い部分を最初のキャプチャグループに強制することは、価値があるよりも厄介な場合があります。

使用している言語によっては、2つの異なるプリコンパイル済み正規表現を使用して、最初の一致の一致するグループを返すことをお勧めします。これにより、興味深い部分を最初のグループに簡単に適合させることができます。

于 2010-04-19T22:01:16.300 に答える
0

グループ番号1の結果を取得できるかどうかはわかりませんが、両方の結果を同じ名前のグループに表示することができます。PowerShellの例を次に示します。

$input1 = 'Purchase of $50.00 worth groceries is required'
$input2 = 'No monthly maintenance required'

$re = '(?:(?<xyz>No) monthly maintenance|Purchase of \$(?<xyz>[\d\.]+) worth groceries)'

$match = [regex]::Match($input1, $re)
$match.Groups['xyz']

$match = [regex]::Match($input2, $re)
$match.Groups['xyz']

その結果、次のようになります。

Success  : True
Captures : {50.00}
Index    : 13
Length   : 5
Value    : 50.00

Success  : True
Captures : {No}
Index    : 0
Length   : 2
Value    : No

ただし、すべての言語が名前付きグループをサポートしているわけではありません。PowerShellは.NETFrameworkで実行されるため、これはすべての.NET言語で機能します。

于 2010-04-19T22:06:28.533 に答える