【发布时间】:2017-08-09 18:35:06
【问题描述】:
什么是 JAVA 中 PHP preg_match($pattern, $text) 的确切等价物?
我在以下 php 和 java 程序中对相同的文本输入以及正则表达式模式得到了不同的结果。
正则表达式 - \b(?:(?>cancer()|problem()|(?>\1|\2)\w+)\b\W*?){0,3}\1\2 在单词数内匹配术语-“癌症问题”。这是{0,3}
PHP
<?php
$text = "doctors found many cancer related chest problems in japan during second world war.";
$pattern = "/\\b(?:(?>cancer()|problem()|(?>\\1|\\2)\\w+)\\b\\W*?){0,3}\\1\\2/i";
if (preg_match($pattern, $text)) {
echo 'matched<br>';
} else {
echo 'not matched<br>';
}
?>
上述程序的 JAVA 实现的确切等价物是什么?
我在以下 java 程序中对相同的文本输入以及正则表达式模式得到了不同的结果。
JAVA
package com.regex.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatchTermWithin_1 {
final static String string = "doctors found many cancer related chest problems in japan during second world war.";
final static String regex = "\\b(?:(?>cancer()|problem()|(?>\\1|\\2)\\w+)\\b\\W*?){0,3}\\1\\2";
public static void main(String[] args) {
// TODO Auto-generated method stub
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
System.out.println("Full match: " + matcher.group(0)+"\n");
for (int i = 0; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
System.out.println("\n");
}else {
System.out.println("not found");
}
if(matcher.matches()) {
System.out.println("matched "+"\n");
}else {
System.out.println("not matched " + "\n");
}
}
}
【问题讨论】:
-
您确定它在 PHP 中按预期工作吗?对图案有什么要求?
-
假设您有一个包含两个单词的术语,例如:-“癌症问题”,那么该术语需要在给定距离内匹配。例如。我们有一个文本“自从问题早上测试我的报告以来没有癌症”然后以上两个词术语需要在正则表达式指定的距离内匹配。这里是 {0,3} 完整的 java 正则表达式 - \\b(?:(?>cancer()|problem()|(?>\\1|\\2)\\w+)\\b\\W* ?){0,3}\\1\\2
-
您还需要以任何顺序匹配这些单词吗?您是否需要将其扩展到两个以上的单词?你可以使用this之类的东西。
-
您还需要以任何顺序匹配这些单词吗?不,您是否需要将其扩展到两个以上的单词?是的。需要匹配为“癌症 xxxx yyyy zzzz 问题”,其中通用正则表达式是 \\b(?:(?>cancer()|problem()|(?>\\1|\\2)\\w+)\ \b\\W*?){0,x}\\1\\2 其中 x 是给定文本内的距离。
-
好吧,听起来您甚至可以将其简化为
\bcancer(?:\W+\w+){0,1}\W+problem\b。只需调整最大阈值即可。
标签: java php preg-match