使用String.matches将PHP preg_match逻辑移植到Java时不兼容

时间:2015-07-13 07:38:57

标签: java php regex

我找到this question关于如何将PHP preg_match移植到Java(它建议使用String.matches()。但是,我仍遇到以下情况的问题:

PHP

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

爪哇

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

为什么会这样?

3 个答案:

答案 0 :(得分:1)

  • 您需要删除正则表达式分隔符。

  • 此外,您还需要添加(?i)修饰符以进行不区分大小写的匹配。

  • 最后,由于>方法尝试匹配整个字符串,所以最后添加matches

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

答案 1 :(得分:1)

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

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

请参阅IDEONE demo

如果您计划在Java中使用相同的正则表达式,请将Matcherfind()一起使用(find将匹配输入字符串中的任意位置,Pattern.CASE_INSENSITIVE将充当{i PHP中的1}}选项:

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

答案 2 :(得分:0)

在Java中它应该是:

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

即。没有正则表达式分隔符和(?i)用于忽略大小写比较。