有没有办法形成这个正则表达式,以便可选组不会在匹配组中结束?

时间:2016-02-10 03:20:55

标签: c# regex

我有正则表达式匹配的代码:

Match regexMatch(string inputStr)
{
 string numberAlphaCaptureRegex = @"^([0-9]+([.][0-9]+)?)\W*([A-Z]*)$";
 return Regex.Match(inputStr,numberAlphaCaptureRegex);
}

我打算用它来匹配字符串,如:

3 ##+ AST
2.54 --&! V
99.22

我使用此代码进行匹配:

match = Regex.Match(valveName, numberAlphaCaptureRegex);

在第一个示例中,我希望匹配在第二个3AST以及第三个2.54中包含组V99.22 }。第一个工作正常,但第二个也包括组.54,第三个还包括.22。我假设这是因为表达式具有可选组([.][0-9]+)?,我已经添加了该组,以便我可以获取整数和小数。有没有办法重写正则表达式,以便我只获得完整的数字?

1 个答案:

答案 0 :(得分:1)

将第二个捕获组改为a non-capturing group

string numberAlphaCaptureRegex = @"^([0-9]+(?:[.][0-9]+)?)\W*([A-Z]*)$";

作为旁注,第二个捕获组([A-Z]*)有时会匹配零个字符(因为*表示零或更多)。为防止这种情况发生,您可以将*更改为+(一个或多个),然后将捕获组设为可选,([A-Z]+)?

Live Example

string numberAlphaCaptureRegex = @"^([0-9]+(?:\.[0-9]+)?)\W*([A-Z]+)?$";

根据您提供的输入进行匹配:

MATCH 1
1.  [0-1]   `3`
2.  [6-9]   `AST`
MATCH 2
1.  [10-14] `2.54`
2.  [20-21] `V`
MATCH 3
1.  [22-27] `99.22`