【问题标题】:Regex, everything between two characters except escaped characters正则表达式,两个字符之间的所有内容,除了转义字符
【发布时间】:2017-10-21 13:45:13
【问题描述】:

我已经尝试过广泛搜索,也有类似的问题,但我无法弄清楚。

我的问题是,我在此表单上还有其他字符串:

%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.%"

这太过分了。我真的不明白为什么会这样,也许是因为我的正则表达式中的 or 条件?非常感谢任何帮助!

【问题讨论】:

  • 你不能在第二步中去掉转义字符吗? s/\\.//g。而且我有点困惑,您是要忽略所有转义字符,还是只忽略百分号?您的问题说明的预期结果与您的示例提供的不同。
  • 问题是转义字符是允许的,所以我不能把它们去掉。我将编辑主要帖子以希望消除混乱,对此感到抱歉!编辑:我已经编辑了主要帖子,其中包含我希望能够选择的正确示例。

标签: regex


【解决方案1】:

这个正则表达式会给你预期的结果:

/(?<!\\)(%.*?(?<!\\)%)/

看到这个Regex101.com

说明

1 - (?&lt;!\\)% 将匹配任何前面没有反斜杠的 % 字符。

2 - .*? 会以惰性方式匹配任何字符

3 - 用 (1) 包围 (2) 将匹配任何由 % 包围且前面没有反斜杠的字符。

【讨论】:

  • 不客气。添加了一些解释,以帮助您理解该过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 2017-11-01
  • 2021-01-24
  • 2011-08-31
相关资源
最近更新 更多