2013-02-18 89 views
0

我想這個代碼PHP轉換成Java,我不能讓相同的工作:從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))在第一次嘗試時失敗。我認爲這一定是匹配方法的問題?

回答

2

String.matches在Java中將檢查整個字符串是否與正則表達式匹配(就像正則表達式在開頭爲^,末尾爲$)。

你需要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); 
+0

不瞭解replacedString StringBuffer的,在哪裏呢inputString去? – Maxrunner 2013-02-18 20:14:05