1

次の文字列を照合して数字を抽出しようとしています:

"Control 1"
"Control 2"

次のような同様の文字列を避けたいと思います。

"Indication 1"
"Local Control Input 2"

これは私が使用しているパターンです:

@"^Control (?<slot>\d+)$"

それは完全に機能しmatch.Groups["slot"].Value、数値を返します。ただし、次のものも一致させる必要があることがわかりました。

"Office In 1"
"Office In 2"

正規表現を次のように変更しました。

@"^(?:Control)|(?:Office In) (?<slot>\d+)$"

問題はmatch.Groups["slot"].Value、空の文字列を返すことです! 少なくとも1桁ある必要はありませんか? +2 つの既存のグループの周りに追加の非キャプチャ グループをランダムに追加してみました。

@"^(?:(?:Control)|(?:Office In)) (?<slot>\d+)$"

これで問題は解決しましたが、その理由はわかりません。

4

1 に答える 1

4

正規表現では、代替が最も優先されます。元の正規表現は"^(?:Control)"(文字列の先頭にある Control) OR "(?:Office In) (?<slot>\d+)$"(文字列の末尾にある Office In ####) です。

次の正規表現を試してください。

@"^(?:Control|Office In) (?<slot>\d+)$"
于 2013-11-12T16:32:21.393 に答える