我有以下xml片段:
<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位的数字,这就是我被卡住的地方。
代码:
//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);
}发布于 2012-01-27 05:54:40
我找到了这个正则表达式。
(\\d{13,16})[<\"'].*?(?=[>\"']\\d{3,4}[<\"'])[>\"'](\\d{3,4})[<\"'];注意:我是使用正则表达式的,因为XML schema不是正则。
我写这篇文章的前提是遵循以下规则。
\d{13,16}\d{3,4}如果我的假设有错,请告诉我。
示例代码
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
);
}
}输出
Credit Card Number=1111123412341234, CCV=111
Credit Card Number=2222123412341234, CCV=222
Credit Card Number=3333111111111111, CCV=333发布于 2012-01-27 05:27:21
不会又是那匹小马吧。
您不能只使用XML有什么特殊的原因吗?如果没有,那么您可以只使用XML
XmlDocument doc = new XmlDocument();
doc.LoadXml(myString);
foreach(XmlElement card in doc.GetElementsByTagName("CreditCard")) {
// Use card.GetElementsByTagName("name")[0].InnerText, etc.
}发布于 2012-01-27 05:36:11
我不太明白这个问题。我假设您至少可以将每个信用卡分开,因为它将被封装在CreditCard标签中。如果XML解析器不是一个选项,那么应该很容易想出一个表达式来匹配开始和结束标记。
在找到元素的开始/结束后,我只需要在内部搜索ccnum并获取它后面的第一组连续数字,然后对ccv执行同样的操作。
https://stackoverflow.com/questions/9025532
复制相似问题