我需要一些帮助来改善正则表达式! 在JavaScript中,我有一个正则表达式,用于查找文件名中的数字对
var nums = str.match(/[\d]{1,}[\d]{1,}/gi);
这将匹配
(1200,627) 我试图改进reg ex,只是有两对以上的数字,以寻找以下内容 数字(1位或更多)+ whitspace(1或更多)+ x(零或一次)+ whitspace(1或更多)+数字(1位或更多)
在第二个例子中应该失败(使用'y'而不是'x'),我认为这将是:
[\d]{1,}[\s]?[x]?[\s]?[\d]{1,}
但它抓住了
中的所有数字与(1200,627,01),而我只想要前两个数字。我写的代码只处理前两个,但我想知道我哪里出错了。只有17级正则表达式向导才能救我!感谢
答案 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)
答案 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}}量词表示"零或多"。