我想在以下字符串中标识某些值,特别是CVC和Number中的值:
CreditCard Number="123" CVC="213" Date="2015-12"
(?<=CVC=\").*(?=")
匹配213" Date="2015-12
。我怎样才能修改正则表达式以找到找到的东西之后的第一个双引号匹配,而不是像现在那样寻找最后的双引号?
此外:如何在前瞻中定义通配符?理想情况下,我想要一个表达式:
(?<=CreditCard.*CVC=\").*(?=")
这意味着CVC语句必须以“CreditCard”字符串开头,但在它们之间可以有任何值。
答案 0 :(得分:4)
您可以简单地使.*
不贪婪.*?
(?<=CVC=\").*?(?=")
在回答第二个问题时,java正则表达式(以及大多数其他引擎)不允许使用可变长度的lookbehinds。通常,您可以通过使用捕获组来解决需要可变长度后视的问题:
(?<=CreditCard.*CVC=\").*?(?=")
变为:
CreditCard.*?CVC=\"(.*?)"
然后您可以从捕获组1中获取相关信息。
RegExr(.*
在RegExr上添加,以便输出替换整个输入,但对于您的情况不是必需的。)
答案 1 :(得分:0)
您可以跳过使用lookbehinds,而是使用群集来拉出所需的字符串部分:
CreditCard Number="(/d*)".*\sCVC="(/d*)"
然后编号为1和2的“匹配组”将分别对应您的信用卡号和CVC。 (您可以使用Matcher.group(int)
检索各个组的值。请注意,通过使用\d
专门匹配数字,您不必使*
非贪婪。在这种情况下它可以工作,因为你只想匹配数字。在一般情况下(假设信用卡号可以包含任何非引号字符),您可以使用自定义字符类来匹配除分隔符之外的任何内容(在这种情况下引用):
CreditCard Number="([^"]*)".*\sCVC="([^"]*)"