c# - 正则表达式匹配可选文本之间的数字

时间:2017-03-13 23:16:44

标签: c# .net regex

我有这个正则表达式:

Regex myRegex = new Regex(@"^[a-zA-Z .:_-]+([0-9]+)[a-zA-Z .:_-]*+$");

我希望以这种方式匹配数字代码:

  • “订单号0123456 lorem ipsum” - 第1组MATCH 0123456
  • “No.0123456” - 第1组匹配0123456
  • “订单0123456” - 第1组匹配0123456
  • “013456 lorem ipsum” - NO MATCH

这可以在这里工作:https://regex101.com/ 但是在.NET中没有C#,因为我有这个例外:

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

是否有另一种可能更优雅的方法来捕捉文本之间的数字(在数字之前是强制性的,在之后是可选的)。

谢谢。

2 个答案:

答案 0 :(得分:4)

*+是占有量词,.NET正则表达式不支持它们。替换为*

使用

^[a-zA-Z .:_-]+([0-9]+)[a-zA-Z .:_-]*$

请参阅.NET regex demo

enter image description here

这里可以使用替代正则表达式,它将匹配OrderNo.,然后匹配0+空格,然后将捕获1+个数字:

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

请参阅another regex demo

答案 1 :(得分:1)

您可以使用以下Regex强制执行数字之前的任何其他内容,然后捕获数字:

\D+(\d+)

请参阅以下详细信息。

\D表示除了数字之外的任何其他内容 +至少1次 仅\d个数字 +至少一次

随意在评论中提问。