Regex 正则表达式:仅当找到字符串A而未找到字符串B时匹配

Regex 正则表达式:仅当找到字符串A而未找到字符串B时匹配,regex,grep,Regex,Grep,我正在尝试编写一个正则表达式,如果找到字符串a而没有找到字符串B,它将返回true 更具体地说,我在我的服务器上查找任何包含文本“base64_decode”但不包含“版权”的文件 谢谢 我想是的 ^.*[^copyright].*base64_decode.*[^copyright].*$ 然而,这将在任何地方抓住版权这一短语,即使它本身不在世界范围内。 我错了,但我下面的例子仍然适用于这里的大多数其他例子 它会相配的 This text is non-copyrightable beca

我正在尝试编写一个正则表达式,如果找到字符串a而没有找到字符串B,它将返回true

更具体地说,我在我的服务器上查找任何包含文本“base64_decode”但不包含“版权”的文件

谢谢

我想是的

^.*[^copyright].*base64_decode.*[^copyright].*$
然而,这将在任何地方抓住版权这一短语,即使它本身不在世界范围内。

我错了,但我下面的例子仍然适用于这里的大多数其他例子

它会相配的

This text is non-copyrightable because I said so! but it is not encoded in base64_decode unfortunatly :(
我想是的

^.*[^copyright].*base64_decode.*[^copyright].*$
然而,这将在任何地方抓住版权这一短语,即使它本身不在世界范围内。

我错了,但我下面的例子仍然适用于这里的大多数其他例子

它会相配的

This text is non-copyrightable because I said so! but it is not encoded in base64_decode unfortunatly :(

使用负向前看和向后看:

^(?)


Perl还不支持这一点:-p.

使用负向前看和向后看:

^(?)


Perl还不支持此操作:-p.

不建议在一个正则表达式中执行此操作,但如果必须,可以使用lookaheads:

^(?=.*must-have)(?!.*must-not-have)
您可能希望在单行/点全部模式下执行此操作,并且起始锚点可能是
\A
,而不是
^

(?=…)
是正向前瞻;它断言给定的模式可以匹配。
(?!…)
是反向前瞻;它断言给定的模式不能匹配

工具书类
  • ,

不建议在一个正则表达式中执行此操作,但如果必须,可以使用lookaheads:

^(?=.*must-have)(?!.*must-not-have)
您可能希望在单行/点全部模式下执行此操作,并且起始锚点可能是
\A
,而不是
^

(?=…)
是正向前瞻;它断言给定的模式可以匹配。
(?!…)
是反向前瞻;它断言给定的模式不能匹配

工具书类
  • ,

    • 管道GREP应该能够轻松实现这一点:


      find-type f-print | xargs grep-l“base64_decode”| xargs grep-l“版权”

      管道grep应该能够轻松实现这一点:


      find-typef-print | xargs grep-l“base64_decode”| xargs grep-l“copyright”

      我不确定您真正的任务是否可以在传递到grep的正则表达式中解决,因为grep逐行处理文件。我会使用
      -l
      --有匹配项的文件
      )和
      -l
      --没有匹配项的文件
      )选项以及命令替换反勾号,如下所示:

      grep -L copyright `grep -l base64_decode *`
      

      grep-l base64\u decode*
      列出了其中包含“base64\u decode”的所有文件的名称,反勾将该列表放在
      grep-l copyright
      之后的命令行上,该命令行搜索这些文件,并列出其中不包含“版权”的子集.

      我不确定您真正的任务是否可以在传递给grep的regex中解决,因为grep逐行处理文件。我会使用
      -l
      -有匹配项的文件)和
      -l
      -没有匹配项的文件)选项以及命令替换反勾号,如下所示:

      grep -L copyright `grep -l base64_decode *`
      

      grep-l base64\u decode*
      列出了其中包含“base64\u decode”的所有文件的名称,反勾将该列表放在
      grep-l copyright
      之后的命令行上,该命令行搜索这些文件,并列出其中不包含“版权”的子集.

      这些是字符类。反转它们并不会像你认为的那样。测试它-仅当版权和base64_解码都存在时匹配。如果只找到base64_解码而没有版权,则需要匹配。@Borelid是对的:你离基础太远了。
      [^copyright]
      匹配任何一个字符,除非它是单词
      版权
      中的一个字符。这些是字符类。反转它们不会像你认为的那样。测试它-仅当版权和base64\u解码都存在时匹配。如果只找到base64\u解码而没有版权,则需要匹配。@Borealid是对的:你是对的太离谱了。
      [^copyright]
      匹配任何一个字符,除非它是word中的一个字符
      版权
      。你真的需要regex吗?你真的需要regex吗?更重要的是,grep不支持它。事实上,据我所知,只有两种regex风格支持无限、可变长度的lookbehinds:.NET和JGSoft(如果算上Java,也可以算三个,但这是一个bug:/)。即使在这些风格中,您通常也最好单独使用lookahead。@Alan:关于Java infinite lookahead,我想说,如果您知道如何操纵bug使其适合您,您可以将其归类为隐藏功能=)更重要的是,grep不支持它。事实上,据我所知,只有两种regex风格支持无界的、可变长度的lookbehinds:.NET和JGSoft(如果算上Java,也有三种,但这是一个bug:/)。即使在这些风格中,您通常也最好单独使用lookahead。@艾伦:关于Java infinite lookahead,我想说的是,如果您知道如何操作该bug使其适合您,您可以将其归类为隐藏功能=)据我所知,grep甚至不支持lookaheads。但不管怎样,我同意这不是一个好办法。两个管道grep呼叫肯定比任何Frankenregex快得多。:据我所知,grep甚至不支持lookaheads。但不管怎样,我同意这不是一个好办法。两个管道grep呼叫肯定会比任何法兰克福人都快得多。:D