首页 > 解决方案 > 正则表达式 - 匹配不在两个字符串之间的字符

问题描述

我读过很多关于寻找正则表达式来匹配两个字符串之间的字符的问题,但我的问题是相反的。我正在尝试创建一个匹配两个字符串之间的字符的表达式。

考虑以下字符串。

This is short & [tag]fun & interesting[/tag].

我想用符号 @ 替换不在标记元素内的任何 &字符。结果应如下所示。

This is short @ [tag]fun & interesting[/tag].

我尝试了以下正则表达式,但不幸的是,它与标记元素内的 & 符号匹配。

/(?<!\[tag\])&(?!\[\/tag\])/g

我知道它与该&符号匹配,因为它被字符串两侧的字符包围。但是我不能添加随机数量的字符来检查,因为后视和前瞻必须是固定长度。

是否有一个正则表达式可以在这里完成我想要的?

标签: javaregex

解决方案


即使使用嵌套标签,这也可以完成工作:

  • 寻找:\[(\w+)\].+?\[/\1\](*SKIP)(*FAIL)|&
  • 代替:@

演示和解释

这个怎么运作:

  • \[(\w+)\].+?\[/\1\]正在尝试将开始和结束标签与里面的一些数据相匹配
  • (*SKIP)(*FAIL)如果找到标签,则丢弃它
  • |别的
  • &匹配一个&符号。此时,我们确定它不在标签内。

不幸的是,这不适用于 Java,但这个要求是在我回答后才添加的。


推荐阅读