正则表达式匹配#define语句中的数字

时间:2013-06-05 12:12:09

标签: regex

我有这样一句话:

#define PROG_HWNR "36084"

或者这个:

#define PROG_HWNR "#37595"

我想提取数字(并增加数字,但这不是问题)

我写了一个正则表达式,但它不起作用(至少在http://gskinner.com/RegExr/中)

(?<="#?)(.*?)(?=")

我也尝试了像

这样的变体
(?<=("#?))(.*?)(?=")

(?<=("|"#)))(.*?)(?=")

但没有成功。问题是,我想匹配数字,无论是否有#...

你能指出我正确的方向吗?谢谢!

3 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

"#?(\d+)"$

它将匹配:

"   a quote
#?  optional hash
(   (start capturing)
\d+ one or more digits
)   (stop capturing)
"   a quote
$   anchor to end

Here is a JSFiddlehere is a RegExr

答案 1 :(得分:2)

问题在于后视镜的可变长度。只有少数正则表达式引擎可以解决这个问题。因为只有两种可能的lookbehinds(包括#或不是),你可以将它扩展为两个lookbehinds:

(?:(?<="#)|(?<=")).*?(?=")

请注意,如果您使用外观,则不需要捕获.*?,因为它们无论如何都会被排除在匹配之外。另外,比使用非贪婪.*?更好的方法是使用一个永远不会超过结束分隔符的贪婪表达式:

(?:(?<="#)|(?<="))[^"]*(?=")

或者(如果您可以访问捕获的子匹配),您可以使用捕获方法并消除外观:

"#?([^"]*)"

答案 2 :(得分:1)

试试这个:

^#define \w+ "#?(\d+)"$

这将匹配整行,第一个/单个组是您要查找的数字。

这实际上是非常基本的正则表达式功能:匹配可选字符(?)并匹配一组字符(括号)。

你甚至可以更简单一点:

\d+

将匹配一串数字。只有数字。并忽略输入字符串的其余部分。

使用此工具测试这些东西,我发现它非常方便:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx