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 仅匹配信用卡号。

我尝试将表达式组合成一个或,但我最终得到了 5 个组(前 2 个表达式中的 2 个和最后一个中的 1 个)

4

3 回答 3

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

这将创建三个捕获组,其中ccnum始终在第二组中,并且series可以在第一组、第三组或没有组中。

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

您可以尝试递归遍历 XML 文档并抓取与您的表达式匹配的每个属性和文本节点 for ccnumandseries并将它们附加到List<string> ccNumListand List<string> seriesList。如果ccnumseries在 DOM 树层次结构中的顺序相同,则ccNumList[i] == seriesList[i].

进行递归树遍历的一个例子是here

于 2012-01-27T22:43:51.163 回答
0

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

至于正则表达式:你的正则表达式对我来说太复杂了,但这是你如何使某个块成为可选的:“(thisisoptional)?”。

除非手动将两个订单包含到正则表达式中,否则您无法解释这两个不同的订单。因此,如果您希望能够匹配“ab”和“ba”(不同的顺序),则需要以下正则表达式:“((ab)|(ba))”。所以那里的一切都是两次。您可以通过将“a”和“b”分别分解为一个字符串变量来减少这种情况。

于 2012-01-27T22:04:42.237 回答