3

次の例では、 pMAINp と最初の pMDSp ののテキストを取得したいと考えています。正規表現には後読みと先読みがあります。

string contents = "pMAINp MAP B FlightTest Load pMDSp ZutiCarrier pWingp some pMDSp more pWingp end";
string blockMainRegex = @"(?<=pMAINp)[\s\w+]+(?=(pMDS)?)";

私が望んでいた結果は「 MAP B FlightTest Load 」でした。

しかし、それが返すものは次のとおりです。「MAP B FlightTest Load pMDSp ZutiCarrier pWingp some pMDSp more pWingp end」

ここで遅延一致を試みていることに気付くでしょう: (pMDS)? これは明らかに機能していません!これについての助けは大歓迎です。ありがとう。:-)

EDIT : おっと、探していたテキストが修正されました。

これはうまく機能します:
string blockMainRegex = @"(?<=pMAINp)[\s\w+]+?(?=pMDS)";

4

2 に答える 2

3

ここで遅延一致を試みていることに気付くでしょう: (pMDS)? これは明らかに機能していません!

レイジーマッチングの仕組みを誤解しているようです。

量指定子に遅延演算子を適用します- *, +, ? など - それ以外の場合は、「0 または 1」として解釈されます。

正規表現の一部をできるだけ少ない文字に一致させたい場合は、正規表現のその部分に関連付けられた量指定子に遅延演算子を適用します。この場合、次のように使用します。

[\s\w+]+?
于 2010-06-28T02:42:15.903 に答える
1
string blockMainRegex = @"pMAINp(.*?)pMDSp";

最初のグループには、あなたが望むものがあります。例えば:

Regex re = new Regex(@"pMAINp(.*?)pMDSp");
string result = re.Match(contents).Groups[1].ToString();
于 2010-06-28T02:41:37.233 に答える