regex 如何让JavaScript正则表达式返回字符串中的所有内容作为匹配的一部分,而不仅仅是匹配的部分

2admgd59  于 2023-08-08  发布在  Java
关注(0)|答案(2)|浏览(80)

测试字符串:

*This* is a test.[15] I would like[16] To figure _out how_ to do this.[20]

字符串
RegEx:

/\[\d+\]|\*.*\*|_.*_/gu


实际结果:

Match 1: *This*
Match 2: [15]
Match 3: [16]
Match 4: _out how_
Match 5: [20]


预期结果:

Match 1: *This*
Match 2:  is a test.
Match 3: [15]
Match 4:  I would like
Match 5: [16]
Match 6:  To figure 
Match 7: _out how_
Match 8:  to do this.
Match 9: [20]

p8h8hvxi

p8h8hvxi1#

您可以考虑这种方法,它使用捕获组分割输入,并使用filter从一开始就删除空匹配。

const s = '*This* is a test.[15] I would like[16] To figure _out how_ to do this.[20]'
console.log( s.split(/(\*[^*]*\*|_[^_]+_|\[\d+\])/).filter(Boolean) );

/*
[
  "*This*",
  " is a test.",
  "[15]",
  " I would like",
  "[16]",
  " To figure ",
  "_out how_",
  " to do this.",
  "[20]"
]
*/

字符串

RegEx详情:

  • (:启动捕获组
  • \*[^*]*\*:匹配*中 Package 的子字符串
  • |:或
  • _[^_]+_:匹配_中 Package 的子字符串
  • |:或
  • \[\d+\]:匹配[number]部件
  • ):结束捕获组
soat7uwm

soat7uwm2#

如果你正在寻找一个纯正则表达式实现。在当前的正则表达式中,您没有包含“非特殊”单词的匹配,因此它们不会显示在匹配中。
只修改你已经拥有的正则表达式。您需要以下内容

/\[\d+\]|\*.*\*|_.*_|.+?(?=\[|_|\*)/gu

字符串
在这里,.+?的添加是一个非贪婪匹配,直到正则表达式遇到任何在正向前瞻(?=\[|_|\*)中提到的字符,即基于您的示例设置的'['或'_'或'*'。

相关问题