C# .NET正则表达式在具有所有格量词的可选文本之间匹配数字无效

C# .NET正则表达式在具有所有格量词的可选文本之间匹配数字无效,c#,.net,regex,C#,.net,Regex,我有一个正则表达式: Regex myRegex = new Regex(@"^[a-zA-Z .:_-]+([0-9]+)[a-zA-Z .:_-]*+$"); 我想用这种方式匹配一个数字代码: “订单号0123456 lorem ipsum”-与第1组中的0123456匹配 “编号0123456”-匹配第1组中的0123456 “订单0123456”-匹配第1组中的0123456 “013456 lorem ipsum”-不匹配 这在这里起作用: 但在使用C#的.NET中没有,因为我有

我有一个正则表达式:

Regex myRegex = new Regex(@"^[a-zA-Z .:_-]+([0-9]+)[a-zA-Z .:_-]*+$");
我想用这种方式匹配一个数字代码:

  • “订单号0123456 lorem ipsum”-与第1组中的0123456匹配
  • “编号0123456”-匹配第1组中的0123456
  • “订单0123456”-匹配第1组中的0123456
  • “013456 lorem ipsum”-不匹配
这在这里起作用: 但在使用C#的.NET中没有,因为我有一个例外:

"System.ArgumentException: parsing "^[a-zA-Z .:_-]+([0-9]+)[a-zA-Z .:_-]*+$" - Nested quantifier +.
   at System.Text.RegularExpressions.RegexParser.ScanRegex()
   at System.Text.RegularExpressions.RegexParser.Parse(String re, RegexOptions op)
   at System.Text.RegularExpressions.Regex..ctor(String pattern, RegexOptions options, TimeSpan matchTimeout, Boolean useCache)
   at System.Text.RegularExpressions.Regex..ctor(String pattern)
   at Rextester.Program.AnalyzeFreetext(String freeText)
   at Rextester.Program.Main(String[] args)"
是否有另一种可能更优雅的方式来捕获文本之间的数字(数字前必须,数字后可选)


谢谢。

您可以使用以下正则表达式,它强制执行数字之前的任何其他内容,然后捕获数字:

\D+(\d+)
详情见下文

\D
表示除数字以外的任何内容
+
至少一次
\d
仅限数字
+
至少一次


欢迎在评论中提问。

*+
是所有格量词,而.NET正则表达式不支持它们。将
*+
替换为
*
,因为您无意在此处使用所有格量词

以下是映射:

?+     => ?
*+     => *
++     => +
{2}+   => {2}
{2,}+  => {2,}
{2,9}+ => {2,9}
使用

这里可以使用另一个正则表达式,它将匹配
顺序
编号
,然后是0+空格,然后将捕获1+位数:

(?:Order|No\.)\s*([0-9]+)

请参见

*+
是所有格量词,而.NET正则表达式不支持它们。替换为
*
(?:Order|No\.)\s*([0-9]+)