0

好的,我正在编写一个我想在某个 url 路径上匹配的正则表达式,以及它下面的所有子文件夹,但有一些被排除在外。对于上下文,这是在 Verizon edgecast 中使用的,它是一个 CDN 缓存系统。它支持正则表达式,但不幸的是我不知道它支持的正则表达式的“风味”,文档也不清楚这一点。似乎支持所有核心正则表达式功能,这应该是我所需要的。不幸的是,阅读文档需要一个帐户,但您可以在这里了解 edgecast 的一般概念:https ://www.verizondigitalmedia.com/platform/edgecast-cdn/

所以,这里有一些示例数据:

help
help/good
help/better
help/great
help/bad
help/bad/worse

这是我现在使用的正则表达式:

(^help$|help\/[^bad].*)

链接:https ://regex101.com/r/CBWUDE/1

分解:

( - start capture group
^ - start of string
help - 1st thing that should match
$ - end of string
| - or
help - another thing that should match
\/ - escaped / so i can match help/
[^bad] - match any single character that isn't b, a, or d
. - any character 
* - any number of times
) - end capture group

我希望前 4 个匹配,但不是最后 2 个,'bad' 或 'bad/worse' 不应该匹配,并且 help/anythingelse 应该匹配

这个正则表达式对我有用,除了帮助/更好不是匹配项。我敢肯定,它不匹配的原因是因为更好,它包含一个出现在“坏”中的字符。如果我将 'better' 更改为 'getter' 那么它就变成了匹配,因为它不再有 ab 了。

所以我真正想要的是我的“坏”只匹配整个单词 bad,而不匹配任何带有 b、a 或 d 的东西。我尝试使用单词边界来做到这一点,但没有给我我需要的结果,但也许我只是语法错误,这就是我尝试过的:

(^help$|help\/[^\bbad\b].*)

但似乎不起作用,不再排除“坏”网址,帮助/更好仍然不匹配。我认为这是因为 / 不是单词边界。我很肯定原始正则表达式的问题在于:

[^bad] - 匹配任何不是 b、a 或 d 的单个字符

我的问题是,我怎样才能将 [^bad] 变成与不包含完整字符串 'bad' 的任何内容相匹配的内容?

4

1 回答 1

1

您将要使用否定前瞻 (?!bad) 而不是否定特定字母 [^bad]

我认为 (^help$|help\/(?!bad).*) 是您正在寻找的

编辑:如果你的意思是任何单词 bad ,而不仅仅是 help/bad 你可以让它 (?!.*bad.*) 这会阻止你匹配 help/matbadtom 例如。完整的正则表达式: (^help$|help\/(?!.*bad.*).*)

于 2018-10-24T16:05:51.967 回答