是否有正则表达式reg
,因此对于任何字符串str
,str.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
产生的数组进行一些修正,这会使问题变得微不足道。
我发现了一些相关的问题,正如预期的那样利用了后视或捕捉组:
答案 0 :(得分:0)
我没有看到这一点,但我们假设您必须在.split不可用的环境中应用它。
制作与.split(".")
或/\./
相同的匹配正则表达式需要考虑以下几种情况:
.
=&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 v62和Node.js v6 behind a flag and v9 without a flag中没有标记。 Firefox小组正在研究它,对于Microsoft Edge,它是implementation suggestion。