我有一个创建程序的任务,该程序匹配数字,而不包含数字。例如:
6X ^ 2 + 6×+ 6-57 + 8-9-90x
我尝试使用正则表达式来捕获所有带有+或 - 的数字,但之后没有x。我试过了
\[+-](\d+)[^x]
但似乎抓住了' -90'来自' -90x'同样。
答案 0 :(得分:8)
正确的正则表达式是:
@"[+-]((?>\d+))(?!x)"
替代非.NET解决方案:
[+-](\d++)(?!x)
@"
[+-] // Prefix non captured
( // Begin capturing group
(?> // Begin atomic (non-backtracking) group - this part is essential
\d+ // One or more digits
) // End atomic group
) // End capturing group
(?! // Begin negative lookahead
x // 'x' literal
) // End negative lookahead
"
您可以对其进行测试here
答案 1 :(得分:0)
原始正则表达式的主要问题是[
已转义且文字[
因此匹配,另一个问题是(\d+)[^x]
捕获1位数并捕获到第1组然后[^x]
匹配任何字符x
。这意味着它也可能匹配一个数字(在您的情况下,与-90x
匹配,[+-]
匹配-
,(\d+)
匹配并捕获9
和{{ 1}}匹配[^x]
)。
更合适的正则表达式是将0
模式与\d
包含在否定前瞻中:
x
请参阅regex demo。
模式详情:
[+-](\d+)(?![\dx])
- [+-]
或+
-
- 捕获第1组匹配1位或更多位数(\d+)
- 如果1位数后跟一位数字或(?![\dx])
,则表示匹配失败。