我尝试对此进行广泛搜索,并且存在类似的问题,但我还没有弄清楚。
我的问题是,除其他外,我还有此表单上的字符串:
%Aliquam hendrerit mollis pretium! Praesent id%
%molestie \*libero vel\%\% pulvinar? Sed%
\%% urna. \% Fusce% in *sapien %mau\*ris.%
我想选择两个 %s 之间的所有内容,忽略字符前面带有\的情况。第一个是微不足道的,我不知何故能够做到第二个。然而第三个我就是想不出来。为了澄清,我想从上面的文本中选择以下内容:
“%Aliquam hendrerit mollis pretium!Praesent id%”
“%molestie *libero vel\%\% pulvinar?Sed%”
“%urna。\%Fusce%”
“%mau*ris.%”
想要指出的是,原始文本可以是一个长字符串的一部分,没有换行符,即每一行不一定出现在新行上。
到目前为止,我已经编写了以下正则表达式,它似乎能够匹配除最后一个之外的所有内容:
(?<!\\)%([^%]*)(?!%\\)(?:%|(.*)%)(?<!\\%)
对于它选择的最后一个:
“% urna。\% Fusce% in *sapien %mau*ris.%”
这太多了。我真的不明白为什么它会这样做,也许是因为我的正则表达式中的或条件?非常感谢任何帮助!
最佳答案
这个正则表达式将为您提供预期的结果:
/(?<!\\)(%.*?(?<!\\)%)/
查看此Regex101.com
说明
1 - (?<!\\)%
将匹配前面没有反斜杠的任何 % 字符。
2 - .*?
将以惰性方式匹配任何字符
3 - 用 (1) 包围 (2) 将匹配由 % 包围且前面没有反斜杠的任何字符。
关于正则表达式,两个字符之间的所有内容(转义字符除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863883/