2

私は正規表現が苦手ですが、次のものがありますが、次の手段の一部は13〜16桁を探し、その後3〜4桁が見つかった場合は成功を返すと想定しています。問題は、3 桁から 4 桁はオプションであり、13 桁から 16 桁の数字の前にもある可能性があるため、正の先読み/後読み、負の先読み/後読みを組み合わせたいと思います。これは複雑に思えますが、もっと簡単な方法はありますか?

(\d{13,16})[<"'].*?(?=[>"']\d{3,4}[<"'])[>"'](\d{3,4})[<"']

これは、次のスニペットの ccnum とシリーズに一致します。

<CreditCard> 
     name="John Doe""
     ccnum=""1111123412341231"" 
     series="339"
     exp="03/13">
</CreditCard>

ただし、ccnum またはシリーズを削除すると、何にも一致せず、シリーズはオプションになる可能性があります。また、シリーズは ccnum の前後に表示される可能性があるため、シリーズ属性を ccnum 属性の前に配置すると、どちらにも一致しません。また、ccnum の前に別の要素としてシリーズがある場合、またはシリーズ要素を無視した場合にも一致しません。

<CreditCard> 
<series>234</series>
<ccnum>1235583839293838</ccnum>
</CreditCard>

次のシナリオに一致する正規表現が必要ですが、要素の正確な名前がわかりません。この場合、ccnum と series と呼んでいます。

機能するものは次のとおりです。

<CreditCard> 
            <ccnum>1235583839293838</ccnum>
            <series>123</series>
</CreditCard>

<CreditCard ccnum="1838383838383833"> 
            <series>123</series>
</CreditCard>

<CreditCard ccnum="1838383838383833" series="139"
</CreditCard>

次のものにも一致する必要がありますが、一致しません。

<CreditCard ccnum="1838383838383833"
            </CreditCard>

<CreditCard series="139" ccnum="1838383838383833" 
            </CreditCard>

<CreditCard ccnum="1838383838383833"></CreditCard>

<CreditCard> 
    <series>123</series>                
    <ccnum>1235583839293838</ccnum>
</CreditCard>

<CreditCard>          
<ccnum series="123">1235583839293838</ccnum>
</CreditCard>

現在、これを機能させるために、3 つの個別の正規表現を使用しています。

1 は、セキュリティ コードの前にあるクレジット カード番号と一致します。

1 は、クレジット カード番号の前にあるセキュリティ コードと一致します。

1 はクレジット カード番号のみに一致します。

式を or に結合しようとしましたが、合計 5 つのグループになりました (最初の 2 つの式から 2 つ、最後の式から 1 つ)。

4

3 に答える 3

0

おそらく、Parse メソッドを使用して XML を XDocument にプルする方がはるかに簡単です。次に、XPath またはそのデータを見つける他の手段を使用できます。

正規表現については、あなたの正規表現は複雑すぎて理解できませんが、特定のブロックをオプションにする方法は次のとおりです:「(thisisoptional)?」。

また、両方の注文を手動で正規表現に含める以外に、2 つの異なる注文を説明することはできません。したがって、"ab" と "ba" (異なる順序) を一致させたい場合は、"((ab)|(ba))" という正規表現が必要です。つまり、すべてが 2 回含まれています。「a」と「b」をそれぞれ文字列変数に分解することで、これの厄介さを減らすことができます。

于 2012-01-27T22:04:42.237 に答える
0

XML ドキュメントを再帰的にトラバースし、 and の式に一致するすべての属性とテキスト ノードをスクレイピングして、それらをccnumandseriesに追加してみList<string> ccNumListてくださいList<string> seriesListccnumseriesが DOM ツリー階層で同じ順序である場合、 ccNumList[i] == seriesList[i].

再帰的なツリー トラバーサルを実行する例は、こちらです。

于 2012-01-27T22:43:51.163 に答える
0
(?<=[>\"'](\\d{3,4})[<\"'].{0,100})?[>\"'](\\d{13,16})[<\"'](?=.*[>\"'](\\d{3,4})[<\"'])?

これにより、3 つのキャプチャ グループが作成されます。ccnumは常に 2 番目のグループにあり、seriesは 1 番目または 3 番目のグループに含まれるか、いずれのグループにも含まれない可能性があります。

ccnum = match.Groups[2].Value;
series = match.Groups[1].Value + m.Groups[3].Value;
于 2013-01-05T10:40:26.297 に答える