4

これは、正規表現と複数のパターンのグループ化に関する私の理解に関連する純粋に学術的な演習です。次の例の文字列があります

<xContext id="ABC">
<xData id="DEF">
<xData id="GHI">
<ID>JKL</ID>
<str>MNO</str>
<str>PQR</str>
<str>
<order id="STU">
<str>VWX</str>
</order>
<order id="YZA">
<str>BCD</str>
</order>
</str>
</xContext>

C# Regex を使用して、3 つの大文字のグループを抽出しようとしています。

現時点でパターン>.+?</を使用すると、

Found 5 matches:
>JKL</
>MNO</
>PQR</
>VWX</
>BCD</

私がそれから使用すると、id=".+?">私は得ます

Found 5 matches:
id="ABC">
id="DEF">
id="GHI">
id="STU">
id="YZA">

|今、両側の各用語に論理ORを使用してそれらを結合しようとしていますid="|>.+?">|</

ただし、これは両方のパターンを組み合わせた結果を私に与えていません

私の質問は次のとおりです。

  1. これが期待どおりに機能しない理由を誰かが説明できますか?

  2. パターンを修正して、両方の結果を正しい順序で組み合わせて表示するにはどうすればよいですか

  3. 結合パターンをさらに拡張して、文字のみを与えるにはどうすればよいですか? まだあることを願っています?<=?=<、確認したいだけです。

ありがとうございました

4

4 に答える 4

4

正規表現は、で区切られた代替オプションをどこから開始または停止するかを認識していません|。したがって、それらをサブパターンに配置する必要があります。

(id="|>).+?(">|</)

ただし、正規表現はXMLを解析するための適切なツールではありません。

これらの丸括弧は、キャプチャサブパターンも追加します。これは自分で返すことができます。したがって、この:

(id="|>)(.+?)(">|</)

一致全体をインデックス0に、フロントデリミタをインデックス1に、実際の一致をインデックス2に、最後のデリミタをインデックス3に返します。ほとんどの正規表現エンジンでは、次のように実行できます。

(?:id="|>)(.+?)(?:">|</)

区切り文字のキャプチャを回避するため。これで、インデックス0は完全に一致し、インデックス1は3文字のみになります。残念ながら、C#でそれらを取得する方法を説明することはできません。

于 2012-10-02T20:06:31.670 に答える
2

代替案をグループ化する必要があります

(?:id="|>).+?(?:">|</)

そして、文字を取得するには、肯定的な後読みおよび先読みアサーションのみを使用します

(?<=id="|>).+?(?=">|</)

ここでRegexrを参照してください

?<=およびで始まるグループ?=は幅ゼロのアサーションです。つまり、それらは一致せず (一致するものは結果の一部ではありません)、後ろまたは前を「見る」だけです。

于 2012-10-02T20:11:37.790 に答える
1

グループFTWをキャプチャします!

@">(?<content>.+?)<|id=""(?<content>.+?)"""

具体的には、名前付きのキャプチャグループです。これは、.NET正規表現フレーバーを使用すると、同じ正規表現で同じグループ名を何度でも使用できるためです。Matchオブジェクトを呼び出すと、その場所(つまり、2つのタグ間または属性Groups["content"]内)に関係なくコンテンツが返されます。id

于 2012-10-02T20:37:36.373 に答える
1

正規表現パターンを使用することをお勧めします(?:(?<=id=")|(?<=>)).+?(?=">|</)

ここでRegExrでテストしてください。

于 2012-10-02T20:19:08.697 に答える