3

別のキーワードで区切られているキーワードの値をキャプチャしようとしています。または、キーワードが任意の順序で繰り返されているか、キャプチャするデータがない可能性があります。

キーワード:K1、K2

入力データ:somedatahereまたはnotk1capturethis1k2capturethis2k2capturethis3k1k2

キャプチャしたデータを

1. capturethis1
2. capturethis2
3. capturethis3
4. 
5.

試しましk1|k2(?<Data>.*?)k1|k2たが、キャプチャされたデータは常に空です。

ありがとう!

4

3 に答える 3

3

あなたは交代で正しい軌道に乗っています。欠けている部分は、後読みと先読みを使用して、区切り文字の前後に何かが必要であることを表明することです。

(?<=k1|k2)(?<Data>.*?)(?=k1|k2)

ルックビハインド(?<=…)とルックアヘッド(?=…)はゼロ幅アサーションであるため、満たす必要がありますが、一致の一部にはなりません。

連続するデリメータのインスタンスをキャプチャしたいというあなたの願望は、「何もない」、つまり2つの文字の間のスペースを実際にキャプチャすることはできないため、少し注意が必要です。1つのアプローチは、後読み(または先読み)をキャプチャすることです。

(?<=(?<Delimiter>k1|k2))(?<Data>.*?)(?=k1|k2)

k1k2これにより、サンプルデータの最後に連続が含まれるため、3つではなく4つの結果が得られます。一致するたびに余分なデータを無視する必要があります(、、、k1)。k2k2k1

于 2012-08-15T14:16:49.453 に答える
3

まず、交互演算子の|優先順位が低いことに注意してください。

k1|k2(?<Data>.*?)k1|k2

k1実際にまたはを探していk2(?<Data>.*?)k1ますk2。グループ化を使用する:

(?:k1|k2)(?<Data>.*?)(?:k1|k2)

次に、ゼロ幅の先読みアサーションと後読みアサーションの使用を検討します。

(?<=k1|k2)(?<Data>.*?)(?=k1|k2)
于 2012-08-15T14:16:54.307 に答える
0
string s="somedatahereornotk1capturethis1k2capturethis2k2capturethis3k1k2";

Regex r=new Regex("(?<=k1|k2).*?(?=k1|k2)");
foreach(Match m in r.Matches(s))
Console.WriteLine(m.Value);
于 2012-08-15T14:54:50.243 に答える