以下每个正则表达式都将匹配任何包含 /client-thank-you/ 且不包含 hire 的字符串,具体取决于您对字符串中“hire”所在位置的假设。
解决方案
“hire”在字符串中的什么位置?
任何地方:
((?!hire).)*?/client-thank-you/((?!hire).)*
仅遵循“/client-thank-you/”:
.*?/client-thank-you/((?!hire).)*
仅紧跟在“/client-thank-you/”之后:
.*?/client-thank-you/(?!hire).*
注意事项
优化:
这些正则表达式中的每一个都将匹配整个字符串。如果您的工具允许您确定字符串是否包含子字符串匹配项(而不是天真地尝试匹配整个字符串),那么您可以通过删除前导 .*? 来优化第二个和第三个正则表达式。同样,第三个正则表达式也可以通过删除尾随的.* 来进一步优化。
肯定需要“任何东西”:
请注意,所有这些正则表达式都假定以“/client-thank-you/”结尾的字符串(后面没有任何内容)是有效的。如果此假设不正确(即字符串 .*/client-thank-you/$ 不匹配),则将每个正则表达式上的尾随 * 更改为 +。这也意味着您必须将第三个正则表达式中的最后一个 .* 保留为 .+(即不要优化它)。
编辑:
上述方法不起作用,因为 GA 使用非常有限的正则表达式版本(不包括环视)。如果没有其他 GA 工具(除了单个正则表达式)可以满足您的需求,那么您可以使用以下方法作为最后的努力:
([-._~!$&'()*+,;=:@/0-9A-Za-gi-z]|h[-._~!$&'()*+,;=:@/0-9A-Za-hj-z]|hi[-._~!$&'()*+,;=:@/0-9A-Za-qs-z]|hir[-._~!$&'()*+,;=:@/0-9A-Za-df-z]|.{1,3}$)
并以扩展形式仅用于说明目的:
( | | | | )
[-._~!$&'()*+,;=:@/0-9A-Za-gi-z] h[-._~!$&'()*+,;=:@/0-9A-Za-hj-z] hi[-._~!$&'()*+,;=:@/0-9A-Za-qs-z] hir[-._~!$&'()*+,;=:@/0-9A-Za-df-z] .{1,3}$
此正则表达式将匹配 1-4 个不构成“雇用”的字符。它通过匹配验证匹配既不是“雇用”也不能用作“雇用”前缀所需的最少字符数来做到这一点。它考虑了行尾(例如,如果“hir”之后没有其他内容,则它是有效的)。它匹配的字符都是可以出现在RFC 3986 中指定的 URL 的路径组件中的所有有效字符。
您可以通过将上面给出的任何解决方案中的每个((?!hire).) 替换为它来使用此正则表达式。例如:
.*?/client-thank-you/([-._~!$&'()*+,;=:@/0-9A-Za-gi-z]|h[-._~!$&'()*+,;=:@/0-9A-Za-hj-z]|hi[-._~!$&'()*+,;=:@/0-9A-Za-qs-z]|hir[-._~!$&'()*+,;=:@/0-9A-Za-df-z]|.{1,3}$).*
这匹配任何包含“/client-thank-you/”但不包含“/client-thank-you/hire”的网址。
不过要小心。双倍的“h”将使此解决方法失败(例如“hhire”)。但是,如果“雇用”只会跟随路径分隔符(即/hire/),那么这应该不是问题。