为什么当输入包含换行符时regex会失败

Why is regex failing when input contains a newline?

本文关键字:regex 失败 换行符 输入 包含 为什么      更新时间:2023-09-26

我从另一个开发人员那里继承了这个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>

我是不是错过了什么?这可能有什么问题?

这里有一个简化但功能等效的正则表达式,应该处理换行符:

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

不知道你为什么要以^.*开头或以.*$结尾,除非你的目标是专门防止换行。否则就是多余的。

编辑:我用's+替换了空格,这样它处理空白的方式会更自由(例如,一个空格、两个空格、一个制表符等应该都匹配)。

tldr使用m修饰符使.与换行符匹配。请参阅MDC正则表达式文档。

失败(注意字符串文字中的"''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)

快乐的编码。