我有这个脚本,它将正则表达式作为变量,然后测试它以查看它是否匹配
如果我跑
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
有什么想法吗?
答案 0 :(得分:1)
您需要负面预测(?!...)
而不是否定字符类[^...]
(这是一个字符类,因此只匹配单个字符):
/^(?!\s*$).*/m
^
将搜索锚定到一行的开头,我们检查该行是否为空,或者仅包含具有否定前瞻(?!\s*$)
的空格。当前瞻成功(未找到模式)时,.*
用于将所有字符消耗到行尾。前瞻不会提升匹配的位置,因此我们最后需要.*
来使用实际文本。
最后的m
标记使^
和$
匹配行的开头和结尾,而不是匹配整个开头和结尾的默认行为字符串。
或者,这是纯正则表达式方法:
/^\s*\S.*/m
我们将确保该行至少有一个非空白字符,并匹配该行的其余部分。