【问题标题】:regex AND operator with negative arguments带有负参数的正则表达式 AND 运算符
【发布时间】:2019-08-17 11:53:33
【问题描述】:

我正在尝试匹配不以.! 结尾且不以."!" 结尾的行,因此它应该同时匹配两者

  • say "bye"
  • say "bye

但不应该匹配:

  • say "bye.
  • say "bye!
  • say "bye."
  • say "bye!"

我尝试使用正负前瞻,尝试将它们用作 AND,如 Regex AND operator 中所建议的那样,但我无法使其正常工作,我也不确定使用前瞻是否可行。

【问题讨论】:

  • say "bye". 等字符串的期望结果应该匹配吗?
  • 你可以试试这样的^(?!.*[.!]"?$).*$
  • 它应该匹配任何不以 .或者 !或 ." 或 !"所以say "bye". 不应该匹配。您的建议似乎有效,我会进一步测试并研究它以了解它的作用;谢谢!
  • 为什么您认为 jEdit 没有后视功能?它当然有,它有 Java 支持的所有东西,包括后视。
  • 因为在 jEdit 的用户指南页面中列出了关于正则表达式前瞻的页面,但没有列出后瞻,所以我认为它没有它们:jedit.org/users-guide/regexps.html

标签: regex jedit and-operator


【解决方案1】:

你可以使用

^(?!.*[.!]"?$).*$

Regex Demo

注意:- 这也匹配空行,因为我们使用*,这意味着匹配任何零个或多个时间,如果你想避免空行匹配你可以使用+ 量词,表示匹配一次或多次

【讨论】:

  • 这可行,但效率很低。应该首选使用否定的lookbehind。
【解决方案2】:

只需使用负面的回顾。 这完全符合您的要求:^.*+(?<![.!]"?)$


^ - 行首
.*+ - 任意数量的字符,不放弃回溯
(?<! + ) - 前面没有
[.!] - 点或感叹号
"? - 可选双引号
$ - 行尾

【讨论】:

  • 而且效率更高,前瞻变体必须匹配整个字符串两次。我的版本需要在正则表达式引擎中始终为 x 个字符长的匹配行 6 步骤,前瞻变体需要 x * 2 + 6 步骤。而我的(现在略有改进)版本需要在正则表达式引擎中始终使用5 步骤的非匹配行,前瞻变体需要10 步骤。
  • “不放弃回溯”是什么意思?
  • 它是一个所有格量词,这意味着一旦它匹配了某些东西,它就不会放弃字符以某种方式找到使正则表达式匹配的匹配项。在regular-expressions.info/possessive.html 上阅读更多相关信息。如果没有 + 用于不匹配的行,引擎将首先匹配所有字符,然后查看结尾是否前面没有点或感叹号以及可选的双引号。由于情况并非如此,非占有的* 将放弃一个字符并进行相同的检查。但由于这永远无法匹配,我们可以在那里使用所有格量词。
  • @Vampire 你在哪里测试过这个正则表达式这向我显示模式错误Regex Demo
  • @CodeManiac 我们正在讨论 Java 正则表达式。使用您链接的内容,您只能测试 PHP、JavaScript、Python 和 Golang 正则表达式。每种口味都有其特点。例如,对于 PHP,您可以编写 ^.*+(?<![.!]|[.!]")$ 以使其有效。
【解决方案3】:

确保bye 不会被.! 接替,并对负字符类进行正面预测,然后使用? 量词使最后一个" 成为可选:

\bsay "bye(?=[^.!])"?

【讨论】:

  • 我怎样才能使它适用于任何行,而不仅仅是示例行?我试过^.+(?=[^.!])"?,但它不起作用。编辑:Code Maniac 的建议似乎有效,我正在测试它。
  • 我假设jEdit 的搜索替换功能具有“全部替换”功能?
  • 是的,确实有。
  • 此版本不会像问题中的第二个示例那样匹配以bye 结尾的行,因为它总是需要在bye 之后有一个字符,而不是点或感叹号。此外,正则表达式不会测试字符串的结尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2010-10-02
  • 2018-06-19
  • 1970-01-01
相关资源
最近更新 更多