【问题标题】:Regex capture consecutive numbers in a pattern正则表达式捕获模式中的连续数字
【发布时间】:2017-07-05 02:44:52
【问题描述】:

尝试从一串模式中提取数字: <Some Alphanumeric> <numbers> X <numbers> <Some Alphanumeric>

例如 I 00 Crazy 060 X 0140 08 Dance 47

应该提取数字0600140以及文本I 00 Crazy08 Dance 47

我正在使用以下正则表达式: (.*)(\d{1,3})\s*(x|X)\s*(\d{1,4})(.*)

但是,这不适用于 X 之前的第一个数字,它仅捕获 0 而不是 060,但正确捕获了第二个数字 0140

\d{1,3} 应该是对长度在 1 到 3 之间的数字的贪婪捕获 - 那么我在这里缺少什么?

【问题讨论】:

  • 你需要对第一组进行惰性匹配 - (.*?)(\d{1,3})\s*([xX])\s*(\d{1,4})(.*)

标签: regex numbers


【解决方案1】:

这应该可行,

(.*)\b(\d{1,3})\s*(x|X)\s*(\d{1,4})(.*)

这里,\b 在字边界处断言位置(^\w|\w$|\W\w|\w\W)

【讨论】:

  • 它有效,但我不清楚为什么在第一个数字而不是第二个数字中需要它。
  • 因为(.*) 会在您下次捕获之前消耗所有内容,即\d{1,3}),甚至是空格。因此,即使这样也可以(.*)\s+(\d{1,3})\s*(x|X)\s*(\d{1,4})(.*)
  • 另外,在第二个中,您明确表示在您的下一个捕获组之前有一个 (x|X),因此它有效。第一个没有分隔符。
  • 好吧,那么为什么不\s+ 而不是\b - 试图了解这种方法的利弊。
  • 好的,我想我明白了,使用lookbehind (?<=\D)(\d{1,3}),这将是一个更好的答案,可以处理空格或不处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多