我發現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
爲什麼會這樣?
我發現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
爲什麼會這樣?
在Java中,matches()
需要一個完整的字符串匹配。而且你不需要正則表達式分隔符。
"<h1>".matches("(?i)<(h1|h2|h3|h4|ul|td|div|table)>")
如果您計劃使用Java中的相同的正則表達式,使用Matcher
與find()
(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));
}
您需要刪除正則表達式分隔符。
此外,您還需要添加(?i)
修飾符來執行不區分大小寫的匹配。
最後,您最後在最後添加了>
,因爲matches
方法試圖匹配整個字符串。
"<h1>".matches("(?i)<(h1|h2|h3|h4|ul|td|div|table)>");
那麼你需要使用'模式和匹配器classes.' –
在Java它應該是:
"<h1>".matches("(?i)<(h[1234]|ul|td|div|table)>");
即用於忽略-情況相比沒有正則表達式定界符和(?i)
。
是否有一個比Patter.compile'東西更糟糕的API? – Xorty
如果你問我換人,我不知道。我只是提供了這個來展示如何在Java和PHP *中使用相同的正則表達式,而無需編輯正則表達式本身*。你實際上可以編寫一個單獨的包裝方法來簡化調用替換,但是你仍然需要添加'import java.util.regex。*;'import。 –
謝謝,我會吮吸:) – Xorty