Javascript .match正则表达式与反向量词(或从右到左解析)

时间:2017-12-04 19:46:07

标签: javascript regex string reverse

给出像这样的字符串......

"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()编写。或者这是否需要编写一个自定义方法,其中包含其他字符串操作以实现此目的?

3 个答案:

答案 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)))));