我有以下格式的字符串:...format=<format_type>...
其中合法format_type
可以是其中之一
image/{png,jpeg,tiff}
或{kmz,kml}
我希望匹配任何非法格式的字符串。例如
foo&bar&format=image/png
和foo&bar&format=kml&baz
不应该匹配,但是
foo&bar&format=image/svg
和foo&bar&format=application/pdf&baz
应。
我已经尝试了.*format=(image\/)?.*(?!=(kml|kmz|png|jpeg|tiff)).*
,但这不起作用。
答案 0 :(得分: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).*$/) { ... }
答案 1 :(得分: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