如何缩短JavaScript的正则表达式?

时间:2011-05-24 01:35:54

标签: javascript regex optimization

基本上我只希望它匹配()内的任何。我尝试了.*,但它们似乎无法正常工作。现在我的正则表达式看起来像:

\(([\\\[\]\-\d\w\s/*\.])+\)

它匹配的字符串是URL路由,如:

#!/foo/bar/([a-z])/([\d\w])/(*)

在这个例子中,上面的正则表达式匹配:

  • ([a-z])
  • ([\d\w])
  • (*)

    <击>奖金: 如何才能使其仅在以(开头并以)结尾时匹配。我以为我使用了^前面的\($以及\)的结尾,但没有运气。 无视此奖金。我没意识到这没关系...

4 个答案:

答案 0 :(得分:3)

  

基本上我只是希望它匹配()内的任何   奖励:我怎样才能使其仅在以(开头并以)结尾时匹配?

轻松自负。

var re1 = /^\(.*\)$/
// or
var re2 = new RegExp('^\\(.*\\)$');

修改

回复:@Mike Samuel's评论

  

与原始中明确匹配的括号之间的换行符不匹配。
  ...
  也许您应该使用[\s\S]代替.
  ...
  如果你要排除换行,你应该有意或明确地这样做。

请注意.匹配除换行符之外的任何单个字符。如果您还想将换行符作为括号中“任何内容”的一部分,请使用[\s\S]字符类:

var re3 = /^\([\s\S]*\)$/
// or
var re4 = new RegExp('^\\([\\s\\S]*\\)$');

答案 1 :(得分:3)

要取消匹配,请使用[^...]构造。因此,要匹配括号内的任何内容,您可以使用:

\([^)]+\)

表示“匹配任何以左括号开头的字符串,包含任意数量的字符关闭括号,并以右括号结束。

要匹配与上述构造匹配的整行,只需将其与^$包裹在一起:

^\([^)]+\)$

答案 2 :(得分:3)

您是否担心嵌套括号?如果没有,您可以将其设置为匹配所有不是结束的字符:

\(([^)]*)\)

答案 3 :(得分:0)

我不完全确定我明白你在做什么,但试试这个:

var re = /\/(\([^()]+\)(?=\/|$)/;

除了开口paren之外,匹配前导斜线确保了paren确实在开头。你不能在最后做同样的事情,因为你不知道一个尾随斜杠。如果有的话,你不想使用它,因为它也是下一次匹配尝试的前导斜杠。

相反,您使用前瞻 - (?=\/|$) - 来匹配尾部斜杠而不使用它。如果没有斜线,我认为也不应该出现其他角色 - 因此锚点:$

不过,@ patorjk提出了一个很好的观点:最外面的一对之间可以有更多的括号吗?如果有的话,问题要复杂得多。我不打算试图扩展我的正则表达式来处理嵌套的parens;一些正则表达式风格可以处理这些事情,但不能处理JavaScript。相反,我会推荐这个比较粗糙的正则表达式:

\/(\([\s\S]+?\))(?=\/|$)

我说“草率”,因为它依赖于假设序列/()/永远不会出现在有效匹配中。与我的第一个正则表达式一样,您感兴趣的文本(即除了前导和尾部斜杠之外的所有内容)都将在#1组中捕获。

注意非贪婪量词。使用常规的贪婪量词,它将在一次拍摄中匹配从第一个(到最后一个)的所有内容。换句话说,它会匹配([a-z])/([\d\w])/(*)而不是([a-z])([\d\w])(*)