有没有办法形成这个正则表达式,以便可选组不会最终进入匹配组

本文关键字:正则表达式 有没有 | 更新日期: 2023-09-27 18:33:53

我有以下代码用于正则表达式匹配:

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);

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

有没有办法形成这个正则表达式,以便可选组不会最终进入匹配组

将第二个捕获组更改为非捕获组:

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

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

现场示例

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`