javascript - 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 问题。然而,这可能是不可能的。
我考虑过的事情:
恕我直言,很明显
reg
需要全局标志,删除捕获组是可能的/[^\.]+/g
与空部分不匹配,例如""
for".a"
或"a..a"
/[^\.]*/g
在非空匹配后产生额外的空字符串,因为当下一个匹配开始迭代时,它可以适合空匹配。例如对于"a"
有了目前javascript 上不可用的功能(但在其他语言上),可以修复之前的缺陷:
/(?<=^|\.)[^\.]*/g
我在这里的结论是,需要考虑真正的空匹配,但不能与非空匹配和以下点或 EOL 之间的空匹配区分开来,而不是“向后看”。这似乎有点模糊,不能算作不可能的正确论据,但也许已经足够了。然而,可能有一个我不知道的 RegExp 功能,例如在匹配后推进索引而不包括符号,或者类似的东西被用作技巧。
允许对阵列进行一些校正步骤,从而match
使问题变得微不足道。
我发现了一些相关的问题,但正如预期的那样,它们使用了后视或捕获组:
解决方案
我不明白这一点,但假设您必须在 .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 v62和Node.js v6 中的 flags 和 v9中没有 flags 。Firefox团队正在努力,对于 Microsoft Edge,这是一个实施建议。
推荐阅读
- sql - AWS Athena 为什么单行或其列的大小不能超过 32 MB 错误 select * from tableName 但不是在 where 条件
- c# - System.Text.Json 不能用对象数组反序列化一个对象?
- javascript - google.script.host.close 不是函数,如何解决?
- python - 通过 AWS Cloudwatch Syntetic Canary 函数获取具有身份验证的 URL
- python - Python:如何在文本框中从单词中读取表格?
- android - 如何从 SQlite 数据库实时加载微调器项目?
- c# - 我只有打印 BINGO ,现在我必须在每个 col 行中输入一个随机数
- swift - 如何将视觉坐标转换为 ARkit 坐标?
- python - 在 RDFLIB 和 Python 中为 Sparql 更新语句使用具有存储值的变量
- javascript - js中的动态多维数组