我不擅长正则表达式,但我有以下内容,但我假设以下部分意味着查找 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 仅匹配信用卡号。
我尝试将表达式组合成一个或,但我最终得到了 5 个组(前 2 个表达式中的 2 个和最后一个中的 1 个)