2014-10-18 70 views
1

我需要一些正则表达式的帮助。如何从一开始就使正则表达式匹配模式?

我正在从JavaScript以下为“面具”可使用以下规则组成的所有特殊的URL:

  • 他们可以像这样的东西0>1223>1_23>

  • 开始
  • 他们可能有协议,前开始:http:\\https:\\

  • 它们也有可能www.子域

因此,例如,对于https://www.example.com应该产生https://www. ...

于是我想出了以下JS:

var url = "0>https://www.example.com/plugins/page.php?href=https://forum.example.com/topic/some_topic"; 
m = url.match(/\b((?:[\d_]+>)?.+\:\/\/(?:www.)?)/i); 
if (m) { 
    url = m[1] + " ..."; 
} 

console.log(url); 

它适用于大多数情况下,除了“重复”的网址在我的例子,在这种情况下,我得到这个:

0 >https://www.example.com/plugins/page.php?href=https:// ......

当我期待:

0> https:// www。 ...

如何让它从一开始就选择匹配?我以为加入\b会做到这一点...

+0

使用非贪婪操作''像这样'\ B((?:?[\ d _] +>)+ \:??\/\ /(?: www。)?)' – 2014-10-18 02:59:57

+0

@alphabravo:刚刚错过了一个问号,呵呵;)谢谢。 – c00000fd 2014-10-18 03:04:38

回答

3

那就让.+,不贪婪,这样

m = url.match(/\b((?:[\d_]+>)?.+?\:\/\/(?:www.)?)/i); 

注意?.+后。这意味着,正则表达式必须匹配到当前表达式之后的第一个:。如果你不使用?,它会使它变得贪婪,它将消耗所有字符,直到字符串中的最后一个:

而且,您不必转义:,您必须在www后转义.。所以,你的正则表达式会变成这个样子

m = url.match(/\b((?:[\d_]+>)?.+?:\/\/(?:www\.)?)/i); 
+0

欣赏它!这里没有关于这个话题,但我一直困惑着什么,我应该逃避什么,我不应该在正则表达式中。这是否有一个规则?如果在我不应该的时候我逃避像':'这样的东西,这是否“坏”? – c00000fd 2014-10-18 03:05:55

+0

@ c00000fd没问题:-)表中的所有字符[这里](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_Special_Characters)都被认为是meta-字符。如果你想匹配他们,他们都必须逃脱。在我们的例子中,'.'在RegEx中有一个特殊的含义,所以我们将其转义为将它看作一个'.'字符本身。 – thefourtheye 2014-10-18 03:10:27