正则表达改进比赛

时间:2014-08-07 11:28:01

标签: javascript regex

我需要一些帮助来改善正则表达式! 在JavaScript中,我有一个正则表达式,用于查找文件名中的数字对

var nums = str.match(/[\d]{1,}[\d]{1,}/gi);

这将匹配

  • DV_Banner_1200x627.jpg
  • DV_Banner_1200y627.jpg
  • DV_Banner_1200 x 627.jpg
  • DV_Banner_1200 x627.jpg
  • DV_Banner_1200 627.jpg

(1200,627) 我试图改进reg ex,只是有两对以上的数字,以寻找以下内容 数字(1位或更多)+ whitspace(1或更多)+ x(零或一次)+ whitspace(1或更多)+数字(1位或更多)

在第二个例子中应该失败(使用'y'而不是'x'),我认为这将是:

[\d]{1,}[\s]?[x]?[\s]?[\d]{1,}

但它抓住了

中的所有数字
  • DV_Banner_1200 x 627 01.jpg

与(1200,627,01),而我只想要前两个数字。我写的代码只处理前两个,但我想知道我哪里出错了。只有17级正则表达式向导才能救我!感谢

3 个答案:

答案 0 :(得分:1)

我使用\d+\s?x?\s?\d+作为我的正则表达式(同样的事情只是将+替换为{1,}并删除不必要的[])。你可以看到它的结果here

它与01匹配的原因是因为所有?。所以它匹配第一个/d+(1个数字:0),然后是0个\s,0个x和0个\s后跟{ {1}}(另外1位数:\d+

正则表达式

1

应该做的伎俩。 Test it here

(\d+)(?:\s?x\s?|\s)(\d+) 是非捕获组。所以它允许交替而不指定它的后向引用。此部分与两个数字之间的字符匹配(具有(?:...)x)。

答案 1 :(得分:0)

试试以下正则表达式:

(\d+)(?:(?: ?x ?)| )(\d+)

demo

答案 2 :(得分:0)

你说你想要"一个或多个" " x"之间的空格字符,但您使用了?量词,这意味着"零或一个"。因此,因为你也标记了" x"作为可选项,它将匹配任何两位或更多位数字:您的第一个[\d]{1,}将与0匹配,然后您的第二个1将与[\d]匹配。

请注意,您不需要将单个原子括在字符范围内:\d可以更简单地写为{1,}。另外+ - 意思是"一个或多个" - 更容易编码为\d+(?:(?:\s+x\s+)|\s+)\d+

如你所愿"一个或多个" " x"两侧的空格字符,我会选择:

(?: ... )

请注意,\d+(?:(?:\s*x\s*)|\s+)\d+ 是一个"非捕获组",因此这些位不会构成您的匹配数组的一部分。但是,我不认为你想要一个或多个"空白字符,因为它不符合你的第一个例子。相反,试试这个:

*

{{1}}量词表示"零或多"。