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