0

このコードをPHPからJavaに変換しようとしていますが、同じように機能させることはできません。

PHP:

function check_syntax($str) {

    // define the grammar
    $number = "\d+(\.\d+)?";
    $ident  = "[a-z]\w*";
    $atom   = "[+-]?($number|$ident)";
    $op     = "[+*/-]";
    $sexpr  = "$atom($op$atom)*"; // simple expression

    // step1. remove whitespace
    $str = preg_replace('~\s+~', '', $str);

    // step2. repeatedly replace parenthetic expressions with 'x'
    $par = "~\($sexpr\)~";
    while(preg_match($par, $str))
        $str = preg_replace($par, 'x', $str);

    // step3. no more parens, the string must be simple expression
    return preg_match("~^$sexpr$~", $str);
}

Java:

private boolean validateExpressionSintax(String exp){

    String number="\\d+(\\.\\d+)?";
    String ident="[a-z]\\w*";
    String atom="[+-]?("+number+"|"+ident+")";
    String op="[+*/-]";
    String sexpr=atom+"("+op+""+atom+")*"; //simple expression

    // step1. remove whitespace
    String str=exp.replaceAll("\\s+", "");

    // step2. repeatedly replace parenthetic expressions with 'x'
    String par = "\\("+sexpr+"\\)";

    while(str.matches(par)){
        str =str.replace(par,"x");
    }

    // step3. no more parens, the string must be simple expression
    return str.matches("^"+sexpr+"$");
}

私は何が間違っているのですか?私は式を使用していますteste1*(teste2+teste3)そして私はphpコードで一致を取得していますが、javaコードでは一致していませんwhile(str.matches(par))。最初の試行で行が失敗します。私はこれがmatchesメソッドの問題であるに違いないと思いますか?

4

1 に答える 1

2

String.matchesJavaでは、文字列全体が正規表現と一致することを確認します(正規表現が^最初と$最後にあるかのように)。

Matcherいくつかの正規表現に一致する文字列内のテキストを見つける必要があります。

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(inputString);

while (matcher.find()) {
    // Extract information from each match
}

あなたの場合、あなたは交換をしているので:

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(inputString);

StringBuffer replacedString = new StringBuffer();

while (matcher.find()) {
    matcher.appendReplacement(replacedString, "x");
}

matcher.appendTail(replacedString);
于 2013-02-18T19:51:41.397 に答える