【问题标题】:Java & PHP - preg_matchJava & PHP - preg_match
【发布时间】: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


【解决方案1】:

我为此做了一个解决方案。希望这可能是 Java 和 PHP 其他专业知识的线索。

package com.ae.text.processor;

import org.apache.commons.lang3.ArrayUtils;

public class ProximitySearch {

    public static boolean MatchTermWithinNumberOfWords(String text, String term, int distance) {

    String[] term_words = term.split(" ");
    String[] right_side_array;
    String right_side = "";
    String tmp = "";

    if (text.contains(term_words[0])) {
        String[] splitted_search_words = text.split(term_words[0]);
        for (int i = 0; i < splitted_search_words.length; i++) {
        if (i == 1) {
            right_side = splitted_search_words[1];
            if (right_side.contains(term_words[1])) {
            right_side_array = right_side.split(" ");
            int indexOfSecondTerm = ArrayUtils.indexOf(right_side_array, term_words[1]);
            for (int j = 0; j <= indexOfSecondTerm; j++) {
                tmp = tmp + " " + right_side_array[j];
            }
            if (indexOfSecondTerm <= distance) {
                printMatched(term_words[0] + tmp);
                return true;
            } else {
                return false;
            }
            }
        }
        }
    }
    return false;
    }

    public static void printMatched(String mathed) {
    System.out.println(mathed);
    }

    public static void main(String[] args) {
    String text = "doctors found many cancer related chest problems in japan durring second world war.";
    String term = "cancer problems";
    int distance = 3;
    System.out.println(MatchTermWithinNumberOfWords(text, term, distance));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多