首页 > 解决方案 > str.match(reg) 等效于 javascript 中的 str.split(".")

问题描述

是否有正则表达式reg,因此对于任何字符串,和str的结果都是等价的?如果多行在某种程度上很重要,那么单行的解决方案就足够了。str.split(".")str.match(reg)

例如:考虑 RegExp /[^\.]+/g: 对于 string "nice.sentance",给出与-"nice.sentance".split(".")相同的结果。但是,任何字符串都不是这种情况。例如,对于空字符串,它们会给出不同的结果,返回和返回,意思不是解决方案,因为它需要适用于任何可能的字符串。"nice.sentance".match(/[^\.]+/g)["nice", "sentance"]"""".split(".")[""]"".match(/[^\.]+/g)null/[^\.]+/g

这个问题来自对另一个问题的误解,这让我感到疑惑。我目前没有实际的应用程序并且很感兴趣,因为我找不到答案 - 它看起来像一个有趣的 RegExp 问题。然而,这可能是不可能的。

我考虑过的事情:

我在这里的结论是,需要考虑真正的空匹配,但不能与非空匹配和以下点或 EOL 之间的空匹配区分开来,而不是“向后看”。这似乎有点模糊,不能算作不可能的正确论据,但也许已经足够了。然而,可能有一个我不知道的 RegExp 功能,例如在匹配后推进索引而不包括符号,或者类似的东西被用作技巧。

允许对阵列进行一些校正步骤,从而match使问题变得微不足道。


我发现了一些相关的问题,但正如预期的那样,它们使用了后视或捕获组:

标签: javascriptregex

解决方案


我不明白这一点,但假设您必须在 .split 不可用的环境中应用它。

制作一个匹配的正则表达式,它与以下几种情况相同.split(".")/\./需要考虑:

  • 没有输入 => 空分割
  • 单个.=> 两个空拆分
  • .在开头 => 位置 0 处的空拆分
  • .最后=>最后的空拆分
  • .在中间
  • 多个连续.的 s => 每一个空拆分..

在此之后,我想出了以下解决方案:

^(?=\.)[^.]*|[^.]+(?=\.)|(?<=\.)[^.]*$|^$|[^.]+|(?=\.)(?<=\.)

代码示例* :

const regex = /^(?=\.)[^.]*|[^.]+(?=\.)|(?<=\.)[^.]*$|^$|[^.]+|(?=\.)(?<=\.)/gm;
const test = `
.
.a
a.
a.a
a..a
.a.
..a..
.a.z
..`;
var a = test.split("\n");
a.forEach(str => {
    console.log(`"${str}"`);
    console.log(str.split("."));
    let m; let matches = [];
    while ((m = regex.exec(str)) !== null) {
        if (m.index === regex.lastIndex) {
            regex.lastIndex++;
        }
        matches.push(m[0]);
    }
    console.log(matches);
});

输出应以三块形式读取:输入/拆分/正则表达式匹配。
第 2 行和第 3 行的输出应该相同。

玩得开心!

*警告:这需要 RegExp Lookbehind 断言:JavaScript Lookbehind 断言已获得TC39的批准,现在是ES2018标准的一部分。

RegExp Lookbehind Assertions 已在 V8 中实现,并且在Google Chrome v62Node.js v6 中的 flags 和 v9中没有 flags 。Firefox团队正在努力,对于 Microsoft Edge,这是一个实施建议


推荐阅读