((xn - )?[a-z0-9] +( - [a-z0-9] +)* \。)+ [a-z] {2,}适用于regexpal.com,但不适用于jsfiddle.net

时间:2013-11-14 19:42:03

标签: javascript regex

因此,下面“模式”中包含的这个正则表达式只能与我在下面的注释中所说的相匹配(最基本的匹配是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/

这是什么交易?

2 个答案:

答案 0 :(得分: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构造函数的正确字符串。

答案 1 :(得分: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