以任何顺序匹配单词和数字正则表达式组

时间:2014-11-01 05:43:53

标签: regex

假设您有以下字符串:

“7个苹果和13个橙子”

/(\d+).*?(apples)/i 

上面的正则表达式将匹配7个苹果但是如果你将订单和数字交替为“45个橙子和9个苹果”。它将匹配第一个数字45而不是与我想要的苹果相对应的数字。

如果我按以下两个顺序编写句子,如何编写正则表达式以匹配并返回数字+苹果的匹配组:

  1. “7个苹果和13个橙子”
  2. “13 oranges 52 apples”
  3. 即,我想匹配7个苹果,匹配组为7,苹果和52个苹果匹配组52和苹果。

4 个答案:

答案 0 :(得分:3)

  • /(\d+).*?(apples)/i
  • 中出错的地方

.*?即使它是一个懒人匹配,它也会匹配从数字到下一个apple

表示字符串

"13 oranges 52 apples"

13到字符串末尾的apple匹配,因为.匹配任何内容

请参阅说明链接:http://regex101.com/r/uL5eX0/2

  • 如何纠正?

由于分隔您的数字和苹果的符号是空格,因此您可以使用\s字符代替.作为

(\d+)\s(apples)

http://regex101.com/r/uL5eX0/3

中的752相匹配

为了安全起见,你可以

(\d+)\s+(apples)

数字和苹果之间的任意数量的空格

字边界\b也可用于额外的安全

答案 1 :(得分:1)

(\d+)(?=\s*(apples))

试试这个。使用积极的前瞻。参见演示。

http://regex101.com/r/yG7zB9/17

答案 2 :(得分:0)

使用此模式
<击> (\d+)\s++(apples\b)

受欢迎的人气需求。

(\d+)\s+(apples\b)

Demo

答案 3 :(得分:0)

您只需添加\D*?代替.*? .匹配中间数字但\D不会。

(\d+)\D*?(apples)

\D*?任何字符的非贪婪匹配,但不是数字零次或多次。

DEMO

你的正则表达式有什么问题?

(\d+).*?(apples)

首先,正则表达式引擎会尝试匹配从左到右满足给定模式的字符。因此\d+将匹配第一个数字,而.*?(apples)会强制引擎匹配字符串apple以外的所有字符。使用\D*?代替.*?强制引擎匹配任何字符,但不能匹配数字为零或更多的数字。