首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何使用Regex来实现这一点?

我如何使用Regex来实现这一点?
EN

Stack Overflow用户
提问于 2012-01-27 05:22:02
回答 3查看 573关注 0票数 0

我有以下xml片段:

代码语言:javascript
复制
<CreditCard 
   name="John Doe" 
   ccnum="1234123412341234" 
   ccv="239" 
   exp="03/13">
</CreditCard>


<CreditCard>
   <name>John Doe</name>
   <ccnum>1234123412341234</ccnum>
   <ccv>239</ccv>
   <exp>03/13</exp>
</CreditCard>

上面的代码片段只是可扩展标记语言存储信用卡数据的许多方法中的两种,所以这里是我的问题所在,我需要扫描xml字符串并找到我已经完成的16位数字,但之后我需要确定安全代码在哪里,在本例中,我将假设它是CreditCard元素中的3-4位数字或类似的数字,然后对其进行加密。我最初的想法是找到16位数字,然后返回,直到我找到第一个开始元素,并假设这是信用卡数据的开始,然后继续搜索3-4位数字,但我不确定如何开始?

假设我坚持使用Regex:

首先,我找到13 - 16位数字,因此在第一个示例中,我找到:

1234123412341234,现在我想在里面扫描一个3-4位的数字,这就是我被卡住的地方。

代码:

代码语言:javascript
复制
//This encrypts 13-16 digit numbers, now I just need to encrypt the 3-4 digit security 
//code
foreach (Match cc in Regex.Matches(xml, @"\b\d{13,16}\b"))
 {

      Console.WriteLine(xml);
      Console.WriteLine(cc);
      xml = xml.Replace(cc.Value, "ENCRYPTED");
      Console.WriteLine(xml);

  }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-27 05:54:40

我找到了这个正则表达式。

代码语言:javascript
复制
(\\d{13,16})[<\"'].*?(?=[>\"']\\d{3,4}[<\"'])[>\"'](\\d{3,4})[<\"'];

注意:我是使用正则表达式的,因为XML schema不是正则

我写这篇文章的前提是遵循以下规则。

  1. 信用卡号码是长度在13-16之间的序列数字。因此,\d{13,16}
  2. CCV数是长度为3-4的序列数字。因此,\d{3,4}
  3. CCV`应始终显示在信用卡号码之后。在这两个字符之间必须至少有一个非数字字符。至少在大多数情况下是这样。因此就有了整个模式。

如果我的假设有错,请告诉我。

示例代码

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        string data = @"<CreditCard> 
                   name=""John Doe"" 
                   ccnum=""1111123412341234"" 
                   ccv=""111"" 
                   exp=""03/13"">
                </CreditCard>


                <CreditCard>
                   <name>John Doe</name>
                   <ccnum>2222123412341234</ccnum>
                   <ccv>222</ccv>
                   <exp>03/13</exp>
                </CreditCard>

                <ResCreditCard 
                    resCreditCardRPH=""1"" 
                    cardCode=""11724"" 
                            cardType=""Credit"" 
                            cardNumber=""3333111111111111"" 
                            cardHolderName=""s"" 
                            expirationDate=""2015-03-31""
                            seriesCode=""333"" />";

        string pattern = "(\\d{13,16})[<\"'].*?(?=[>\"']\\d{3,4}[<\"'])[>\"'](\\d{3,4})[<\"']";
        Regex re = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);

        foreach (Match m in re.Matches(data))
            if (m.Success)
                Console.WriteLine(
                    "Credit Card Number={0}, CCV={1}",
                    m.Groups[1].Value,
                    m.Groups[2].Value
                 );

    }
}

输出

代码语言:javascript
复制
Credit Card Number=1111123412341234, CCV=111
Credit Card Number=2222123412341234, CCV=222
Credit Card Number=3333111111111111, CCV=333
票数 1
EN

Stack Overflow用户

发布于 2012-01-27 05:27:21

不会又是那匹小马吧。

您不能只使用XML有什么特殊的原因吗?如果没有,那么您可以只使用XML

代码语言:javascript
复制
XmlDocument doc = new XmlDocument();
doc.LoadXml(myString);

foreach(XmlElement card in doc.GetElementsByTagName("CreditCard")) {
    // Use card.GetElementsByTagName("name")[0].InnerText, etc.
}
票数 6
EN

Stack Overflow用户

发布于 2012-01-27 05:36:11

我不太明白这个问题。我假设您至少可以将每个信用卡分开,因为它将被封装在CreditCard标签中。如果XML解析器不是一个选项,那么应该很容易想出一个表达式来匹配开始和结束标记。

在找到元素的开始/结束后,我只需要在内部搜索ccnum并获取它后面的第一组连续数字,然后对ccv执行同样的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9025532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档