javascript - JS匹配 'any string'正则表达式返回整个空字符串

标签 javascript regex string

我对 .* 的行为感到困惑如果使用全局标志,JavaScript 中的正则表达式:

var str = "Hello World!",
    reg = new RegExp(".*","g");
var matched = str.match(reg); 
// matched == ["Hello World!", ""]

我不明白为什么它要向 matched 添加一个空字符串大批。当正则表达式没有全局 g 时,不会发生这种情况。标志。

其背后的逻辑是什么?

最佳答案

每个字符串的每个字符之前和之后都有空字符串。

现在,您正在与 .* 进行贪婪匹配,这实际上意味着“零个或多个字符并尽可能匹配”。这里,Hello World!.* 匹配,然后是全局修饰符。因此,它尝试再次匹配并匹配末尾的空字符串(之所以匹配,是因为 .* 表示零个或多个字符)。这就是您在结果中得到它的原因。

您可以使用+确认相同的内容,如下所示

var str = "Hello World!";
var reg = new RegExp(".+", "g");
console.log(str.match(reg));
// [ 'Hello World!' ]

这里,+表示一次或多次。由于 .+Hello World! 匹配,因此全局修饰符再次搜索,但找不到更多可匹配的字符。


想看一些有趣的东西吗?试试这个

var str = "Hello World!";
var reg = new RegExp(".*?", "g");
console.log(str.match(reg));
// [ '', '', '', '', '', '', '', '', '', '', '', '', '' ]

这是为什么呢? .*? 表示匹配零个或多个字符,但仅匹配尽可能少的字符(非贪婪)。因此,它从第一个字符开始,找到空字符串就关闭搜索。全局修饰符再次进行匹配,在H之后找到另一个空字符串,依此类推,直到到达字符串末尾。

但是如果你使用+,就像这样

var str = "Hello World!";
var reg = new RegExp(".+?", "g");
console.log(str.match(reg));
// [ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' ]

它必须匹配一个或多个字符,但匹配次数尽可能少。所以,它匹配一个字符,停止。全局修饰符再次匹配,匹配第二个字符,依此类推。

关于javascript - JS匹配 'any string'正则表达式返回整个空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38321288/

相关文章:

c - (C 编程) 如何将字符串插入字符数组,然后打印出该数组的所有元素?

javascript - 在 Chrome 和 Safari 上,菜单仍处于悬停状态

Javascript Web Firebase获取在本地运行但不在公共(public)IP中运行的 token

regex - Apache mod 重写在 mac 上自动添加文件扩展名

c - 大字符串 C/C++ 的优化

iphone - 如何将字符串拆分成句子 cocoa

javascript - Meteor: Redirect to another url using Meteor.go ('url' ) 遇到错误

javascript - 当构建 URL 时出现 null 时,Firefox 不知道该怎么办

python - 使用正则表达式从字符串中仅提取 Unicode 字符

regex - 正则表达式排除特定字符串