当输入包含换行符时,为什么正则表达式失败?

时间:2012-01-26 23:28:15

标签: javascript regex

我从其他开发者那里继承了这个javascript正则表达式,现在,即使没有任何改变,它似乎也不匹配所需的文本。这是正则表达式:

/^.*(already (active|exists|registered)).*$/i

我需要它来匹配任何看起来像

的文字
  东西已经存在更多的东西等等

它对我来说看起来很好,它只能在一起查找这两个单词,理论上应该忽略其余的字符串。在我的脚本中,我检查了这样的文本

var cardUsedRE = /^.*(already (active|exists|registered)).*$/i;
if(cardUsedRE.test(responseText)){
    mdiv.className = 'userError';
    mdiv.innerHTML = 'The card # has already been registered';
    document.getElementById('cardErrMsg').innerHTML = arrowGif;

}

我已经在FireBug中介绍了这一点,我发现它无法测试此字符串:

> Error: <detail>Card number already registered for CLP.\n</detail>

我错过了什么吗?这有什么可能的问题?

2 个答案:

答案 0 :(得分:3)

这是一个简化但功能相同的正则表达式,应该处理换行符:

/(already\s+(active|exists|registered))/i

不确定为什么您希望以^.*为导向或以.*$结束,除非您的目标是专门用于阻止换行。否则它就是多余的。

编辑:我用\s+替换了空格,因此它处理空格的方式会更加自由(例如,一个空格,两个空格,一个标签等都应该匹配)

答案 1 :(得分:2)

tldr; 使用m修饰符使.匹配换行符。请参阅MDC regular expression documentation

失败(请注意字符串文字中的“\ n”):

var str = "Error: <detail>Card number already registered for CLP.\n</detail>"
str.match(/^.*(already (active|exists|registered)).*$/i)

工作(注意m的“多行”行为的.标记:

var str = "Error: <detail>Card number already registered for CLP.\n</detail>"
str.match(/^.*(already (active|exists|registered)).*$/mi)

我会使用更简单的形式:(调整“空格”的定义。)

var str = "Error: <detail>Card number already registered for CLP.\n</detail>";
str.match(/(?:already\s+(?:active|exists|registered))/i)

快乐的编码。