st.match(reg)等效于javascript

时间:2018-06-12 02:09:01

标签: javascript regex

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

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

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

我考虑的事情:

  • Imho很明显reg需要全局标记,删除捕获组是可能的

  • /[^\.]+/g与空白部分不匹配,例如适用于""".a""a..a"

  • /[^\.]*/g在非空匹配后产生额外的空字符串,因为当迭代开始下一个匹配时,它可以适合空匹配。例如。 "a"

  • 借助javascript currently上提供的功能(但使用其他语言),可以修复以前的缺陷:/(?<=^|\.)[^\.]*/g

我的结论是,需要考虑真正的空匹配,但不能区分非空匹配与后续点或EOL之间的空匹配,而不是&#34;看后面&#34;。这似乎有点含糊不清,认为它是不可能的正确论据,但也许已经足够了。然而,可能有一个我不知道的RegExp功能,例如在匹配之后推进索引而不包括符号,或类似的东西用作技巧。

允许对match产生的数组进行一些修正,这会使问题变得微不足道。

我发现了一些相关的问题,正如预期的那样利用了后视或捕捉组:

1 个答案:

答案 0 :(得分:0)

我没有看到这一点,但我们假设您必须在.split不可用的环境中应用它。

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

  • 没有输入=&gt;空分裂
  • . =&gt;两个空分裂
  • 开头的
  • . =&gt;位置0的空分裂
  • 最后的
  • . =&gt;最后空分裂
  • .位于中间
  • 多个连续. s =&gt;每..
  • 一个空分割

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

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

代码示例 *

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断言已在V8中实现,并且在Google Chrome v62Node.js v6 behind a flag and v9 without a flag中没有标记。 Firefox小组正在研究它,对于Microsoft Edge,它是implementation suggestion