2015-07-13 71 views
1
移植PHP的preg_match邏輯到Java的時候

我發現this question如何端口PHP的preg_match到Java(它建議使用String.matches()不過,我還是有以下情況的麻煩:不兼容使用String.matches

PHP

preg_match('/<(h1|h2|h3|h4|ul|td|div|table)/i', '<h1>') =>返回1

爪哇

"<h1>".matches("/<(h1|h2|h3|h4|ul|td|div|table)/i") =>退貨false

爲什麼會這樣?

回答

1

在Java中,matches()需要一個完整的字符串匹配。而且你不需要正則表達式分隔符。

"<h1>".matches("(?i)<(h1|h2|h3|h4|ul|td|div|table)>") 

IDEONE demo

如果您計劃使用Java中的相同的正則表達式,使用Matcherfind()find將在輸入字符串中的任何地方匹配和Pattern.CASE_INSENSITIVE將作爲PHP i選項):

String str = "<h1>"; 
String rx = "<(h1|h2|h3|h4|ul|td|div|table)"; 
Pattern ptrn = Pattern.compile(rx, Pattern.CASE_INSENSITIVE); 
Matcher m = ptrn.matcher(str); 
while (m.find()) { 
    System.out.println(m.group(0)); 
} 

another demo

+0

是否有一個比Patter.compile'東西更糟糕的API? – Xorty

+0

如果你問我換人,我不知道。我只是提供了這個來展示如何在Java和PHP *中使用相同的正則表達式,而無需編輯正則表達式本身*。你實際上可以編寫一個單獨的包裝方法來簡化調用替換,但是你仍然需要添加'import java.util.regex。*;'import。 –

+0

謝謝,我會吮吸:) – Xorty

1
  • 您需要刪除正則表達式分隔符。

  • 此外,您還需要添加(?i)修飾符來執行不區分大小寫的匹配。

  • 最後,您最後在最後添加了>,因爲matches方法試圖匹配整個字符串。

    "<h1>".matches("(?i)<(h1|h2|h3|h4|ul|td|div|table)>"); 
    
+0

對不起,我意識到這不是一個正確的答案。雖然php版本匹配'

你好

',java版本不會 – Xorty

+1

那麼你需要使用'模式和匹配器classes.' –

0

在Java它應該是:

"<h1>".matches("(?i)<(h[1234]|ul|td|div|table)>"); 

即用於忽略-情況相比沒有正則表達式定界符和(?i)