1

所以下面“模式”中包含的这个正则表达式只应该匹配我在下面的评论中所说的(最基本的匹配是1个字母后跟一个点,然后是两个字母)

var link = "Help"
// matches www-data.it -- needs at least (1 letter + '.' + 2 letters )
var pattern = '((xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}';
var re2 = new RegExp('^' + pattern, 'i');


// if no http and there is something.something
if (link.search(re2) == 0)
{
    link = link;
}

当我测试此代码@ http://regexpal.com/时,它可以工作,例如只有某些东西通过。

当我在 JSFiddle 和生产环境中对其进行测试时,它的匹配程度超出了应有的程度,例如“帮助”匹配。 http://jsfiddle.net/2jU4D/

这是怎么回事?

4

2 回答 2

5

您应该使用本机正则表达式语法构造正则表达式:

var re2 = /^((xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}/i;

特别是,当您调用 . 时\.,正则表达式中的. 字符串语法也使用反斜杠进行引用,因此当表达式第一次被解析为字符串时,反斜杠将被“吃掉”。.new RegExp()

或者:

var pattern = '((xn--)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}';
var re2 = new RegExp('^' + pattern, 'i');

加倍反斜杠将为您留下正确的字符串以传递给 RegExp 构造函数。

于 2013-11-14T19:45:21.617 回答
1

这是它匹配的细分。我会用非捕获组替换所有捕获组。并将所有锚点放在正则表达式的主体中(以后不要附加)。

正则表达式是有效的,不知道它的分隔符或你使用它的方式。
注意所需的部分,您会看到它不正确匹配,但
我不认为是因为正则表达式。

 (                         # (1 start)
      ( xn-- )?                 # (2), optional capture 'xn--'
      [a-z0-9]+                 # many lower case letters or digits
      ( - [a-z0-9]+ )*          # (3), optional many captures of '-' followed by many lower case letters or digits
      \.                        # a dot '.'
 )+                        # (1 end), overwrite this capture buffer many times
 [a-z]{2,}                 # Two or more lower case letters
于 2013-11-14T19:58:12.157 回答