我对正则表达式不太满意,但是我有以下内容,但我认为以下内容的一部分表示查找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之前或之后,因此,如果将series属性放在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个,最后一个表达式中有1个)

最佳答案

使用其Parse方法将XML提取到XDocument中可能要容易得多。然后,您可以使用XPath或其他方法来查找该数据。

至于正则表达式:我想理解您的正则表达式很复杂,但这是使某个特定块可选的方式:“(thisisoptional)?”。

而且,您不能考虑两个不同的订单,除非将两个订单手动包括在正则表达式中。因此,如果要能够匹配“ ab”和“ ba”(不同的顺序),则需要以下正则表达式:“(((ab)|(ba))””。因此,一切都在那里两次。您可以通过将“ a”和“ b”分别分解为一个字符串变量来减少这种麻烦。

10-06 04:38