3

次の文字列が与えられた場合

1080s: 33, 6&apos;2&quot; meg: test. 1748s: I THINK IM GONNA <span class="highlight" >PICK</span> 1749s: TWO COMPLETE OPPOSITES.

正規表現操作を行いたいのですが、次の一致が必要です

1st match : 1080s: 33, 6&apos;2&quot; meg: test. 
2nd match : 1748s: I THINK IM GONNA <span class="highlight" >PICK</span> 
3rd match : 1749s: TWO COMPLETE OPPOSITES.

ASP.NET で次の正規表現を使用して一致を実行しています

MatchCollection mcs = Regex.Matches(txtData, "(\\d*)(s:)([^(\\d*)](s:){0})*");

正規表現は一致しますが、キャプチャは正しくありません。\d*正規表現は、 orが見つかるとすぐにテキストをスキップしますs:\d*s:が一緒に見つかった場合にのみスキップしたい。

\d*私はそれをいくつかの異なる方法で試しましたが、両方を結合する方法とs:not 演算子をまだ見つけていません。

4

3 に答える 3

4

正規表現エンジンに次のように指示する必要があります(\\d*)(s:)これは、先読みを使用して実行できます。

于 2012-01-03T11:46:57.893 に答える
3

任意の桁数(正確に4桁だけでなく)に一致させたい場合は、次のコードを使用して一致させることができます。

var pattern = @".+?(?<!\d)((?=\d+s:)|$)";
var matches = Regex.Matches(input, pattern);

.+?、少なくとも1文字の貪欲でない一致です。欲張りでない必要があります。そうでない場合、.+は、の出現をスキップして文字列全体に一致します\d+s:

(?<!\d)、一致する最後の文字が数字ではないことを保証するネガティブルックビハインド.です。桁数が4に固定されていないため、これが必要です。この後読みが含まれていない場合、入力「X12」はまたはのいずれany, digit, digitかに一致する可能性がありますany, any, digit12番目の一致を避け、それがとして一致しdigit、ではなく一致することを確認するために後読みが必要anyです。

前向きな先読み((?=\d+s:)|$)であり、一致がいくつかの数字の後に続くか、単に文字列()の終わりで終わることを保証します。この先読みはアサーションであり、一致には含まれないことに注意してください。試合の後に先読みが続くことを保証するだけです。s:$

于 2012-01-03T14:13:25.910 に答える
2

@Ilyaが提案するように、正規表現の正の先読みを使用できます。

var pattern = @"\b(?=\s*\d{0,4}s:)";
var lines = new Regex(pattern).Split(input).Where(
    s => 
    string.IsNullOrEmpty(s.Trim()) == false).ToArray();

説明
\b(?=\s*\d{0,4}s:)-> 単語境界から始めて、接尾辞に一致しますが、キャプチャから除外します。サフィックスは、「任意の数の空白文字の後に長さ 0 ~ 4 の数字、s、および:.
入力が分割されたら、入力を消去して空のエントリを削除します。

于 2012-01-03T12:31:13.310 に答える