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