2016-11-26 257 views
1

我有一個正則表達式https://regex101.com/r/PPbhRn/1。在這裏我看到,當「和」被捕獲時,我能夠看到上面也捕獲到的一些空白空間。有沒有辦法擺脫那些空白?並且我想知道只有在正確捕獲分組時模式纔會匹配?正則表達式分組和匹配

String validRegex="(((?:[(]* ?[a-z][a-z]+ ?[)]*)|[(]* ?(NOT) (?:[(]* ?[a-z][a-z]+ ?[)]*) ?[)]*)((AND|OR) ((?:[(]* ?[a-z][a-z]+ ?[)]*)|[(]* ?(NOT) (?:[(]* ?[a-z][a-z]+ ?[)]*) ?[)]*))*)"; 

    String formula = "mean AND trip OR (mean OR mango) AND (mean AND orange) OR mango AND (test OR NOT help)"; 
    Pattern p1 = Pattern.compile(validRegex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE); 
    final Matcher matcher = p1.matcher(formula); 

    boolean result=MarketMeasureUtil.isValidFormula(formula); 
    System.out.println(result); 

    while (matcher.find()) { 
     System.out.println("Full match: " + matcher.group(0)); 
     for (int i = 1; i <= matcher.groupCount(); i++) { 
      System.out.println("Group " + i + ": " + matcher.group(i)); 
      System.out.println(matcher.group() + "starting at" + "index" + matcher.start()+ "and ending at index" +matcher.end()); 

     } 

我不能夠正確地捕捉到組,我需要捕獲基團例如「均值和之旅」「或」「的意思或芒果」。等等。 isValidFormula()調用的正則表達式。火柴()。在我們的案例中,匹配正常。分組不能正常工作

+4

只有完整匹配包含這些空格。第2組只是'和'總是... – marekful

+0

我需要一個正則表達式來捕獲像(蘋果和菠蘿OR或(雞蛋)和(菠蘿))字符串,在那裏我有一個詞的約束後應跟着一個謂詞「AND/OR 「而且它應該適當地捕獲這些羣體。如果我嘗試正則表達式匹配上述即時通訊不能正確捕獲組..有什麼辦法來解決? @marekful –

+1

請編輯您的問題並顯示您嘗試過的實際問題和Java代碼。正則表達式對於每種語言/工具都略有不同,所以我認爲我們不應該僅基於Regex101鏈接來回答。 –

回答

0

正則表達式不適合此任務。我懷疑如果你可以添加儘可能多的大括號,甚至可以驗證表達式。

你必須寫一個解析器,構建樹,使用一個類,如:

class Node { 

    boolean[] isAnd = null; 
    Node[] children = null; 
    String literal = null; 

    Node(String literal) { // creator for literals 
     this.literal = literal; 
    } 

    Node(boolean[] isAnd) { // creator for intermediate nodes 
     this.isAnd = isAnd; 
     children = new Node[isAnd.length + 1]; 
    } 

} 

而且該方法是這樣的:

Node parse(String) throws ParseException { // returns the root 

首先,你可以刪除多餘的括號通過計算所有大括號的右側和左側,然後您可以找到0級and s和or(即那些不是大括號的),並創建中間節點(如果未找到任何0級and s和or那麼字符串必須是文字或它是無效的。如果它是中間節點,則通過遞歸調用parse方法來添加子級,方法是使用圍繞0級andor s的子字符串。

0

看起來像你創建了某種DSL。 如果你的「語言」不復雜,你應該考慮使用解析器或實現你自己的解析器。

我假設你只是評估OR/AND操作。這與編碼計算器非常相似,其中AND(乘法)優先於OR(加法)。因此你可以實現你自己的。 您可以首先標記語句並驗證它,但不要試圖同時使用正則表達式執行這兩個操作。如果驗證是您可以在此結束的唯一目的。 接下來,如果您必須評估表達式,則可以使用標記創建二叉樹(OR操作數爲左葉,AND操作數爲右葉爲例),並應用您的語法來評估表達式。

+0

不,我只需要驗證表達式,我不想評估它。我需要paattern像「(蘋果和(ornage OR kiwi))」。 regex.matches()部分適用於mw。但我不能忍受分組 –