0

我有以下形式的字符串:...format=<format_type>...其中 legal format_types 可以是其中之一

image/{png,jpeg,tiff}或者{kmz,kml}

我想匹配任何具有非法格式类型的字符串。例如

foo&bar&format=image/pngfoo&bar&format=kml&baz

不应该匹配,但是

foo&bar&format=image/svgfoo&bar&format=application/pdf&baz

应该。

我试过.*format=(image\/)?.*(?!=(kml|kmz|png|jpeg|tiff)).*了,但这不起作用。

4

2 回答 2

3

毫无疑问,有一个匹配任何非法格式的正则表达式,但编写一个匹配的格式看起来更容易。因此,一个快速的解决方法可能是查找与合法模式不匹配的任何字符串,而不是查找与非法模式匹配的字符串。

所以而不是

if (str =~ m/ ...illegal pattern... /) { ... }

你可以使用

if not (str =~ m/ ...legal pattern... /) { ... }
unless (str =~ m/ ...legal pattern... /) { ... }

所以你得到:

if not (str =~ m/^.*format=(image\/(png|jpeg|tiff))|kmz|kml).*$/) { ... }
于 2013-01-09T21:32:52.217 回答
2

我手边没有 PERL 解释器,但这似乎在 Java 中有效:

^.*format=(?!(?:image/)?(?:kml|kmz|png|jpeg|tiff)).*$

这是测试它的代码段:

private static final Pattern REGEX = 
   Pattern.compile("^.*format=(?!(?:image/)?(?:kml|kmz|png|jpeg|tiff)).*$");

public static void main(String[] args) {
    for (String format : Arrays.asList("foo&bar&format=image/png", 
            "foo&bar&format=kml&baz", "foo&bar&format=image/svg", 
            "foo&bar&format=application/pdf&baz")) {
        System.out.printf("%s %s%n", format, 
            REGEX.matcher(format).matches() ? "matches" : "does not match");
    }
}

印刷:

foo&bar&format=image/png does not match
foo&bar&format=kml&baz does not match
foo&bar&format=image/svg matches
foo&bar&format=application/pdf&baz matches
于 2013-01-09T21:23:24.887 回答