0

入力: ゴミ="stff",start1="allshortsofCharactersExceptDoubleQuotes",start2="*&^%$blahblah"

望ましい結果:DoubleQuotes を除くすべての文字の短編

*&^%$ブラブラ

c# .NET を使用:

string myRegExString = @"(?<=start[0-9].).*(?="")"

収量: allshortsofCharactersExceptDoubleQuotes",start2="*&^%$blahblah

テストを通じて、.* を二重引用符以外のすべての文字を含むセットに置き換えると、望ましい結果が得られることがわかっていますが、それは大変な作業であり、間違いを犯すことになります。.* の前に (?!"") または (?!="") を使用しても機能しません。

では、最初に見つかった二重引用符で先読みを停止するにはどうすればよいでしょうか。

回答からの正解(私がテストした限り):

(?<=start\d+="")[^""]*(?="")

また

(?<=start\d+="")[^""]+(?="")

または、これも機能しますが、要求されたものとはまったく異なります。

(?<=start\d+="")[^""]*

ありがとう。私はこのアイテムの先読みの側面に夢中になりました。

4

3 に答える 3

1

可能な限り一致しない遅延量指定子.*?を使用する必要があります..あなたの場合、可能な限り.*一致するため、最後までキャプチャします"

(?<=start\d+="").*?(?="")

このコードを使用して、そのような値のリストを取得できます

List<string> output=Regex.Matches(input,regex)
                         .Cast<Match>()
                         .Select(x=>x.Value)
                         .ToList();
于 2013-07-12T05:34:44.920 に答える
0

正規表現の問題は、.* が一致するテキストが多すぎることです。'.*?' のようにスターの後に疑問符を追加すると、正規表現を遅延させることができます。または、二重引用符を除くすべてのものに一致するように変更することもできます:'[^"]*'この場合はこれを選択します。以下はうまくいくはずです。未検証

string myRegExString = @"(?<=start[0-9].)[^""]*(?="")"

私が提案する他の解決策は次のとおりです。

string myRegExString = @"(?<=start[0-9].).*?(?="")"
于 2013-07-12T05:35:08.890 に答える