2013-01-09 143 views
0

我有以下形式的字符串:...format=<format_type>...其相應法律format_type s時,可以的正則表達式模式匹配對字符串不包含特定模式

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)).*,但這不起作用。

+0

你們是不是隻匹配格式,即圖像/ SVG或整個文本即富和酒吧和格式=圖像/ SVG? – Tom

+0

@Tom:我想匹配整個字符串。 – cdk

回答

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 
+0

這個工作正常。只需在圖像後面跳過斜線:'/^.* format =(?!(?: image \ /)?(?: kml | kmz | png | jpeg | tiff))。* $ /'。 – mgamba

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

你也可以使用不匹配運算符'!〜'而不是 – user1937198

+0

不知道運算符是否存在,學到了一些新東西,謝謝! – Sander

相關問題