我有这样一句话:
#define PROG_HWNR "36084"
或者这个:
#define PROG_HWNR "#37595"
我想提取数字(并增加数字,但这不是问题)
我写了一个正则表达式,但它不起作用(至少在http://gskinner.com/RegExr/中)
(?<="#?)(.*?)(?=")
我也尝试了像
这样的变体(?<=("#?))(.*?)(?=")
或
(?<=("|"#)))(.*?)(?=")
但没有成功。问题是,我想匹配仅数字,无论是否有#...
你能指出我正确的方向吗?谢谢!答案 0 :(得分:3)
试试这个正则表达式:
"#?(\d+)"$
它将匹配:
" a quote
#? optional hash
( (start capturing)
\d+ one or more digits
) (stop capturing)
" a quote
$ anchor to end
答案 1 :(得分:2)
问题在于后视镜的可变长度。只有少数正则表达式引擎可以解决这个问题。因为只有两种可能的lookbehinds(包括#
或不是),你可以将它扩展为两个lookbehinds:
(?:(?<="#)|(?<=")).*?(?=")
请注意,如果您使用外观,则不需要捕获.*?
,因为它们无论如何都会被排除在匹配之外。另外,比使用非贪婪.*?
更好的方法是使用一个永远不会超过结束分隔符的贪婪表达式:
(?:(?<="#)|(?<="))[^"]*(?=")
或者(如果您可以访问捕获的子匹配),您可以使用捕获方法并消除外观:
"#?([^"]*)"
答案 2 :(得分:1)
试试这个:
^#define \w+ "#?(\d+)"$
这将匹配整行,第一个/单个组是您要查找的数字。
这实际上是非常基本的正则表达式功能:匹配可选字符(?
)并匹配一组字符(括号)。
你甚至可以更简单一点:
\d+
将匹配一串数字。只有数字。并忽略输入字符串的其余部分。
使用此工具测试这些东西,我发现它非常方便:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx