给出像这样的字符串......
"ABCDEFG"
是否有可能有一个量词在"反向"那么说呢?
例如:
var foo = "ABCDEFG";
foo.match(/.{1,3}/g);
结果:
// Array(3) ["ABC", "DEF", "G"]
我尝试实现的目标:
// Array(3) ["A", "BCD", "EFG"]
因此,无论字符串长度如何,数组始终是字符串的表示形式,每个节点的长度为3个字符(可能除了第1个),但始终从字符串的末尾开始。所以第一个数组项可能是1,2或3个字符长,这取决于" s"剩下"。
我尝试使用以下错误:
foo.match(/.{-1,3}/g); // null
foo.match(/.{1,-3}/g); // null
想想也许我可以使用类似于拆分字符串的否定,但是每个示例都返回null。
我假设这可以在模式中以某种方式完成,而不是量词,所以我想了解如何用.match()
编写。或者这是否需要编写一个自定义方法,其中包含其他字符串操作以实现此目的?
答案 0 :(得分:6)
正则表达式始终从左到右匹配,但您可以使用带有字符串结尾锚点的正向前瞻来实现您想要的效果:
var foo = "ABCDEFG";
foo.match(/.{1,3}(?=(.{3})*$)/g); // ["A", "BCD", "EFG"]
此处子模式(?=(.{3})*$)
是一个超前表达式,它匹配零(或完全!)3个字符的重复次数或多次重复,这些字符位于字符串末尾($
)。
答案 1 :(得分:2)
正如评论中所述,没有正则表达式或量词符合您的字符串,从右向左向后阅读。
您可以在此处执行的操作是在调用string
之前撤消.match()
,然后撤消匹配array
:
var matches = foo.split("").reverse().join("")
.match(/.{1,3}/g).map(m => m.split("").reverse().join(""))
.reverse();
<强>解释强>
foo.split("").reverse().join("")
来撤消原始string
。.match()
。string
.map(m => m.split("").reverse().join(""))
保留匹配项。array
。<强>演示:强>
var foo = "ABCDEFG";
var matches = foo.split("").reverse().join("").match(/.{1,3}/g).map(m => m.split("").reverse().join("")).reverse();
console.log(matches);
答案 2 :(得分:0)
如果您构建自定义正则表达式,则可以使用它以正确的顺序拉出匹配项:
var foo = "ABCDEFG";
console.log(foo.match(new RegExp("(.{"+foo.length % 3+"})"+"(...)".repeat(Math.floor(foo.length / 3)))));