将本机正则表达式转换为带有变量的RegExp对象时出错

时间:2015-07-27 15:56:51

标签: javascript regex

我有这个脚本,它将正则表达式作为变量,然后测试它以查看它是否匹配

如果我跑

var r = /[^(^$|\s+)]+/
r.exec(" ")
>> null
r.exec("a ")
>> ["a "]

但是当我跑步时

var r = new RegExp("[^(^$|\s+)]+")
r.exec(" ")
>> [" "]
r.exec("a ")
>> ["a "]

我无法在不更改预期行为的情况下将本机语法转换为对象RegExp。我的一个尝试是输出相反的结果,当第一个正则表达式为空时,第二个正则表达式是匹配的数组,反之亦然

@edit 据我所知,如果我使用match代替exec,则会发生同样的情况

@edit

预期结果是:匹配任何非空字符串 https://regex101.com/r/qD0bO3/1

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要负面预测(?!...)而不是否定字符类[^...](这是一个字符类,因此只匹配单个字符):

/^(?!\s*$).*/m

^将搜索锚定到一行的开头,我们检查该行是否为空,或者仅包含具有否定前瞻(?!\s*$)的空格。当前瞻成功(未找到模式)时,.*用于将所有字符消耗到行尾。前瞻不会提升匹配的位置,因此我们最后需要.*来使用实际文本。

最后的m标记使^$匹配行的开头和结尾,而不是匹配整个开头和结尾的默认行为字符串。

或者,这是纯正则表达式方法:

/^\s*\S.*/m

我们将确保该行至少有一个非空白字符,并匹配该行的其余部分。