0

パターンの別の部分で以前にキャプチャされたグループの数値を参照する .net 正規表現パターンを持つことは可能ですか? 次の形式を繰り返す文字列に一致させる必要があります。

  • 10 バイトの英字キー、2 バイトの演算子 (SQL 演算子のサブセット)、5 桁の整数、n バイトの値が続きます。ここで、n は 5 桁の整数の整数値です。

EX 文字列:
"key1 = 00004val1key2 <=00006value2key3 >=00011value_three"

val1 は 4 バイト、value2 は 6 バイト、value_three は 11 バイトなどです。この文字列は、次の文字列を解析して識別するために必要な条件の繰り返しセットを表しています。

第 1 基準: 「key1」、「=」、「val1」

2 番目の条件:「key2」、「<=」、「value2」

3 番目の基準: "key3"、">="、"value_three"

私は過去に .net 正規表現を使用したことがあり、繰り返しパターンでキー、演算子、および数字を解析することを理解できるはずですが、どのように、またはその数値を参照できるかどうかさえわかりません数字 (つまり、文字列 "00004" の値が 4 の整数) をパターンの後半に配置します。

更新 1 当初、次のような正規表現パターンが必要だと考えていました。

^(?<criteria>(?<key>\w{10})(?<operator>(= |<=|>=))(?<value_length>\d{5})(?<value>\w{n}))+$

ここで、「値」キャプチャ グループの {n} 量指定子には、キャプチャされた「基準」ごとに、「value_length」キャプチャ グループの値に基づく値が必要です。これが正規表現パターンの形成について考える正しい方法でない場合は、機能する別のアプローチに変更できます。

4

2 に答える 2

0

代わりに、先読みを使用して次の\w{10}and 演算子まで一致自体で必要な長さの文字列をキャプチャできます(= |<=|>=)

string regex=@"(?<key>\w{10})(?<operator>(= |<=|>=))(?<value_length>\d{5})(?<value>.*?(?=\w{10}(= |<=|>=)|$))";
foreach(Match m in Regex.Matches(input,regex,RegexOptions.Singleline))
{
    int vLen=int.Parse(m.Groups["value_length"].Value);
    string requiredString=m.Groups["value"].Value.Substring(0,vLen-1);
}
于 2013-01-18T07:35:00.120 に答える
0

投稿を削除しましたが、それは不可能です。正規表現には Backreference と呼ばれるものがあり、これが役立つ場合があります。

に一致させたい場合aba、そのための言語パターンは次のようvalue1 followed by another value, followed by value 1になります。これは正規表現として構築できます: (a)b\1\1一致する最初のグループの一致を参照します。

ただし、後方参照を使用する正規表現は、実際にはもはや正規表現ではないことに注意してください。これは、「通常の言語」では定義ごとに再帰が許可されていないためです。これは、シーンの背後で起こっていることです。(完全なパターンを評価する前に、パターンの一部を評価する必要があります)

于 2013-01-18T07:44:06.607 に答える