您需要的是一个匹配替代项的正则表达式,并且只会将最后一个替代项捕获到第 1 组中,该替代项将呈现一个调和的贪婪标记(或一个展开版本以获得更好的性能 - 如果您只有 2 或 3 个):
&|((?:(?!&)[\s\S])+)
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示(展开版本 -&|([^&]*(?:&(?!amp;)[^&]*)*)
图案:
&- 匹配&实体|- 或者((?:(?!&)[\s\S])+)- 将不是序列起点的任何文本块(1 个以上字符)匹配并捕获到组 1 中&。由于它是针对 JS 的,因此您需要一个[\s\S](或) 来匹配包括换行符在内的[^]任何字符。否则,请使用(如果您只想匹配lines)。.&|((?:(?!&)[\s\S])+)
Run Code Online (Sandbox Code Playgroud)