正则表达式改进匹配

Regex improvement match

本文关键字:正则表达式      更新时间:2023-09-26

我需要一些帮助来改进正则表达式!在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
  • 627.
  • DV_Banner_1200 jpg

(1200年,627年)我试图改进正则表达式,只是以防有两对以上的数字,寻找以下内容数字(1位或以上)+空格(1位或以上)+ x(0或一次)+空格(1位或以上)+数字(1位或以上)

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

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

但是它会抓取

中的所有数字
  • DV_Banner_1200 x 62701 .jpg

with(1200,627,01),而我只想要前两个数字。我编写的代码只处理前两个,但我想知道我哪里出错了。现在只有17级的正则表达式巫师才能救我!由于

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

之所以匹配01是因为所有的?。所以它匹配第一个/d+(1位数字:0),然后是's的0,x的0,'s的0,然后是'd+(另一个1位数字:1)

正则表达式

('d+)(?:'s?x's?|'s)('d+)

就可以了。在这里测试

(?:...)为非捕获组。所以它允许在不给它分配反向引用的情况下进行改变。这部分匹配两个数字之间的字符(x<space>)。

试试下面的regex:

('d+)(?:(?: ?x ?)| )('d+)
演示

您说希望在"x"之间有"一个或多个"空白字符,但是您使用了?量词,这意味着" 0或1 "。因此,由于您还将"x"标记为可选的,因此它将匹配任何两位或两位以上的数字:您的第一个['d]{1,}将匹配0,然后您的第二个1将匹配。

注意,您不需要将单个原子括在一个字符范围内:['d]可以更简单地写成'd。另外,{1,}——意思是"一个或多个"——更容易编码为+

如果你想在"x"的两边有"一个或多个"空白字符,我会用:

'd+(?:(?:'s+x's+)|'s+)'d+

注意(?: ... )是一个"非捕获组",所以这些位不会构成你的匹配数组的一部分。但是,我认为您不需要"一个或多个"空白字符,因为这与您的第一个示例不匹配。相反,试着这样做:

'd+(?:(?:'s*x's*)|'s+)'d+

其中*量词表示"零或多"