簡體   English   中英

使用String.matches將PHP preg_match邏輯移植到Java時不兼容

[英]Incompatibility when porting PHP preg_match logic to Java using String.matches

我發現這個問題,就如何端口PHP的preg_match到Java(它建議使用String.matches()不過,我還是有以下情況的麻煩:

PHP的

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

Java的

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

為什么會這樣呢?

  • 您需要刪除正則表達式定界符。

  • 並且您還需要添加(?i)修飾符以進行不區分大小寫的匹配。

  • 最后,你已經TYO添加>在最后,因為matches方法試圖將整個字符串相匹配。

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

在Java中, matches()需要完整的字符串匹配。 而且您不需要正則表達式定界符。

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

IDEONE演示

如果您打算在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));
}

觀看另一個演示

在Java中,應為:

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

即沒有正則表達式定界符和(?i)用於忽略大小寫比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM