繁体   English   中英

JavaScript正则表达式字符串匹配/替换

[英]JavaScript Regular Expression String Match/Replace

给定字符串; “ {abc} Lorem ipsum {/ abc} {a}美元{/ a}”

我希望能够找到大括号“标签”的出现,将标签和索引存储在找到的位置,并将其从原始字符串中删除。 我想为每次出现重复此过程,但是因为每次索引必须正确时我都会删除部分字符串...我找不到所有索引,然后在末尾将其删除。 对于上面的示例,应该发生的事情是:

  • 搜索字符串...
  • 在索引0处找到“ {abc}”
  • 将{标签:“ {abc}”,索引:0}推入数组
  • 从字符串中删除“ {abc}”
  • 重复步骤1,直到找不到更多匹配项

在这种逻辑下,应该在索引11处找到“ {/ abc}”,因为“ {abc}”已被删除。

我基本上需要知道这些“标签”在哪里开始和结束,而实际上并没有将它们作为字符串的一部分。

我几乎在使用正则表达式,但有时会跳过出现的情况。

 let BETWEEN_CURLYS = /{.*?}/g; let text = '{abc}Lorem ipsum{/abc} {a}dolor{/a}'; let match = BETWEEN_CURLYS.exec(text); let tags = []; while (match !== null) { tags.push(match); text = text.replace(match[0], ''); match = BETWEEN_CURLYS.exec(text); } console.log(text); // should be; Lorem ipsum dolor console.log(tags); /** * almost there...but misses '{a}' * [ '{abc}', index: 0, input: '{abc}Lorem ipsum{/abc} {a}dolor{/a}' ] * [ '{/abc}', index: 11, input: 'Lorem ipsum{/abc} {a}dolor{/a}' ] * [ '{/a}', index: 20, input: 'Lorem ipsum {a}dolor{/a}' ] */ 

您需要从正则表达式lastIndex值中减去匹配长度,否则下一次迭代的启动将比预期的要长(因为输入变得更短,并且在调用replace删除{...}子字符串后, lastIndex不会更改):

 let BETWEEN_CURLYS = /{.*?}/g; let text = '{abc}Lorem ipsum{/abc} {a}dolor{/a}'; let match = BETWEEN_CURLYS.exec(text); let tags = []; while (match !== null) { tags.push(match); text = text.replace(match[0], ''); BETWEEN_CURLYS.lastIndex = BETWEEN_CURLYS.lastIndex - match[0].length; // HERE match = BETWEEN_CURLYS.exec(text); } console.log(text); // should be; Lorem ipsum dolor console.log(tags); 

请记住更多RegExp#exec参考:

如果您的正则表达式使用“ g ”标志,则可以多次使用exec()方法在同一字符串中查找连续的匹配项。 这样做时,搜索将从正则表达式的lastIndex属性指定的str的子字符串开始( test()还将使lastIndex属性前进)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM