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 に答える