包含一个字符串但不包含另一个字符串的字符串正则表达式

5
我们的项目中有一个正则表达式,可以匹配任何包含字符串"/pdf/"的URL:
(.+)/pdf/.+

需要修改它,以便它不匹配还包含“help”的URL。
例子: 不应匹配:“/dealer/help/us/en/pdf/simple.pdf” 应该匹配:“/dealer/us/en/pdf/simple.pdf”

使用什么编程语言、什么样式的正则表达式以及什么代码来进行匹配? - J Earls
值可以是 Perl5 风格的正则表达式。 - Jacob Petersen
“help”可以出现在“/pdf/”之后吗?如果是这样,它应该与“/dealer/us/en/pdf/help.pdf”匹配吗? - Andrew Morton
你用什么工具匹配正则表达式?比如说,你是在使用grep工具吗?还是使用某种编程语言来实现的? - ffledgling
2个回答

3

2
(?:^|\s)((?:[^h ]|h(?!elp))+\/pdf\/\S*)(?:$|\s)

第一件事是匹配空格或行的开头。
(?:^|\s)

然后我们匹配任何不是 h 的内容,或者任何一个没有在其后面有 elph,一次或多次 +,直到找到一个 /pdf/,然后匹配非空格字符 \S 任意次数 *
((?:[^h ]|h(?!elp))+\/pdf\/\S*)

如果我们想要在 /pdf/ 之后检测到 help,我们可以从开头重复匹配。
((?:[^h ]|h(?!elp))+\/pdf\/(?:[^h ]|h(?!elp))+)

最后,我们匹配一个或者结束行/字符串($)。
(?:$|\s)

完整的匹配将包括前导/尾随空格,并且应该被去除。如果您使用捕获组1,则无需去除两端。

在regex101上的示例


这非常复杂,可以更容易地实现 :) - Jan
@Jan 这将立即提供可用的捕获组,而不是匹配整行。由于这个原因,它可以匹配嵌入文本中的 URL,或者仅匹配未通过换行符分隔的 URL 列表。 - TemporalWolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接