1

我有这样的一行:

#define PROG_HWNR "36084"

或这个:

#define PROG_HWNR "#37595"

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

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

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

我也尝试过类似的变化

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

或者

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

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

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

4

3 回答 3

3

Try this regex:

"#?(\d+)"$

It will match:

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

Here is a JSFiddle, and here is a RegExr

于 2013-06-05T12:16:11.617 回答
2

问题是后视的可变长度。只有少数正则表达式引擎可以处理这个问题。因为只有两种可能的lookbehinds(包括#or not),您可以将其扩展为两个lookbehinds:

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

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

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

或者(如果您可以访问捕获的子匹配),您可以使用捕获方法并摆脱环视:

"#?([^"]*)"
于 2013-06-05T12:18:13.127 回答
1

尝试这个:

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

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

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

你甚至可以更简单:

\d+

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

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

于 2013-06-05T12:18:02.173 回答