2017-08-04 42 views
0

我在Groovy中尋找一個正則表達式組這將符合所有這些和這將有一批在這些例子中匹配指定部分:Groovy的正則表達式與

  1. priority = "4-Not Prioritized Yet"⇒組:4尚未優先
  2. priority != "4-Not Prioritized Yet"⇒組:4尚未優先
  3. priority = High⇒組:
  4. priority = "2-Medium"⇒組:2中
  5. priority changed⇒無組
  6. priority is EMPTY⇒無組


我v Ë嘗試了幾種正則表達式模式,如:

  • /(?i)priority\s*!?=\s*"?([^"]+)"?/
  • /(?i)priority[^\w]+([^"]+)"?/

,但我無法找到所有的實例工作的模式。 所以我想知道我的正則表達式有什麼問題,以及 會在所有示例中工作的模式。

我試圖做的恰恰是這樣的:

def str = "{project = "TEST"} AND {priority = "4-Not Prioritized Yet"} OR {priority is EMPTY} OR {priority changed} OR {priority = "2-Medium"} OR {priority = "1-High"} OR {priority = "test"} order by priority DESC" 
str.replaceAll(/(?i)\{([^\}]+)\}/) {a, b-> 
    if(b.startsWith("priority")) { 
     def regex = /(?i)priority([^\w]+)([^"]+)/ 
     def match = (b =~ regex); 
     /* And now I would like to do something like: 
      if (match has group) 
       return b.replace(group, "something else") 
      else return b */ 
    } else return b; 
} 
+0

我認爲這很接近......你只需要刪除最後的「如果存在:'priority \ s * [=!] + \ s * \」(。*)' - 編輯格式 – digitaLink

+0

不,這是一個非常不明確的問題。你有'def str =「」「{project =」TEST「} AND {priority =」4-Not Prioritized Yet「}或{priority is EMPTY} or {priority changed} OR {priority =」2-Medium「} {priority =「1-High」}或者{priority =「test」}按優先級排序DESC「」「',對不對?現在,預期的產出是多少?請提供[在小提琴裏面]的預期輸出(http://ideone.com/vLQPRn)。 –

回答

1

您可以使用以下正則表達式:

priority (?:(changed|is EMPTY)|!?= ("?)([^"}]+)\2) 

說明:

  • priority - 字面匹配字符(共同開始)。
  • (?: - 開始一個不匹配的組。這是必要的,因爲它包含 變體。
  • (changed|is EMPTY) - 變體1(第一捕獲組) - 同時捕獲 個案將被替換爲否組
  • | - 變異分離器。
  • !?= - 變體2的開頭 - 匹配文字字符(可選!=)。
  • ("?) - 捕獲組2 - 捕獲報價(如果有)。
  • ([^"}]+) - 捕獲組3 - 優先級值字符串。
  • \2 - 匹配的內容是由組2
  • )捕獲 - 非捕獲組的結束。

而下面你有一個例子程序,打印原件及替換字符串:

def str = '{project = "TEST"} AND {priority = "4-Not Prioritized Yet"}\ 
OR {priority is EMPTY} OR {priority changed} OR {priority = "2-Medium"}\ 
OR {priority = "1-High"} OR {priority = "test"} order by priority DESC' 
println str 
def res = str.replaceAll(/priority (?:(changed|is EMPTY)|!?= ("?)([^"}]+)\2)/) { 
    m, g1, g2, g3 -> 
    if (g1?.trim()) { 
    return "No Group" 
    } else if (g3?.trim()) { 
    return "Group: $g3" 
    } else { 
    return m 
    } 
} 
println res 

封閉 - 的的replaceAll論點有論據:

  • m - 整場比賽,
  • g1 ... g3 - 各個ca捕獲的內容組團。

如果第1組抓到了,我們有個案。

第2組獲得報價(如果有)。

如果第3組捕捉到了,我們有組...的情況。

還有一句關於你的程序的評論:replaceAll不會編輯文本 「到位」。被替換的文本返回爲結果該函數 並且原始字符串不會更改。所以有必要保存這個函數的結果 。