2016-08-12 192 views
1

我正在嘗試編寫正則表達式,但在某些情況下無法正常工作。這裏是正則表達式正則表達式匹配最短匹配而不是最長

(\/[ABCGIKLNPRSUV])?(\/RC-[A-Z0-9]{2,6})? 

的匹配可能是由以下

  • /R/RC-ABC123
  • /R
  • /RC-ABC123

的之一以上正則表達式適用於/ R和/ R/RC-ABC123,但不適用於/ RC-ABC123。對於/ RC-ABC123,它將與第一組而不是第二組匹配,並僅將/ R作爲匹配組件。

如何讓它適用於所有情況。此外,上述表達式只是完整表達式的一部分,即在RC-ABC123之後可能有另一個(第三)組。但是要先讓這兩個團隊工作。

更新 該??似乎在regex101中工作,但不在java中。我用下面的代碼

Pattern pattern = Pattern.compile("(/[A-Z])??(/RC-[A-Z0-9]{2,6})?"); 
    Matcher matcher = pattern.matcher("/R/RC-ABC12345"); 
    if(matcher.find()) { 
     for(int i=1; i<= matcher.groupCount(); i++) { 
      System.out.println("Group("+i+") = " + matcher.group(i)); 
     } 
    }else { 
     System.out.println("Pattern does not match"); 
    } 
+1

僅供參考而已,它所以它在這一點上做的第一個可選的小組賽。你有沒有嘗試添加錨點'^'和'$',所以它*必須*匹配一個完整的條目? – usr2564301

+0

試試['(/R(?:C-[A-Z0-9]{2,6})?)()(/[ABCGIKLNPSUV])?"](https:regex101.com/r/xA9fA2/1 )。請注意,在Java正則表達式中,您不需要轉義'/'。 –

+0

你可以使用'??'而不是'?'來代替'?'來製作一個非貪婪的選項。 – Barmar

回答

0

使得第一可選組非貪婪與??,所以它會選擇相匹配的第二組,如果它有一個獲得2組,但與/ R/RC-ABC123空值選擇。

(/[ABCGIKLNPRSUV])??(/RC-[A-Z0-9]{2,6})? 

DEMO

+0

謝謝..但看起來像你使用/ g選項。如果您刪除該/ g選項,則它不起作用。如果我使用類似Java的東西,我不認爲有指定/ g的選項。而且,我正在調用一個由某人編寫的庫,它只需要匹配該模式和字符串並將其分組。 – delta313

+0

regex101.com需要'g'修飾符來查看演示中的多個匹配項。如果一次只匹配一個字符串,則不需要它。 – Barmar

+0

它在java中不起作用,因爲我得到2個組但是具有空值。但是,根據regex101的結果,我會接受答案。 – delta313

0

你需要確保R從第一可選組字符類取,因爲它允許在同一位置作爲第二組的首場小組賽。

您可以創建一個非捕獲子組的第一個捕獲組內來處理這種情況和「脾氣」的R分支負先行,所以它僅匹配R S中的沒有隨着C-,然後2至6個大寫ASCII字母或數字:

Pattern pattern = Pattern.compile("(/(?:R(?!C-[A-Z0-9]{2,6})|[ABCGIKLNPSUV]))?(/RC-[A-Z0-9]{2,6})?"); 

請參閱Java demo。測試結果:

/RC-ABC123 -> { Group(1) = null, Group(2) = /RC-ABC123 } 
/R/RC-ABC123 -> { Group(1) = /R, Group(2) = /RC-ABC123 } 
/R   -> { Group(1) = /R, Group(2) = null } 
/S/RC-ABC123 -> { Group(1) = /S, Group(2) = /RC-ABC123 } 

圖案的詳細資料

  • (/(?:R(?!C-[A-Z0-9]{2,6})|[ABCGIKLNPSUV]))? - 可選第2組:
    • / - 斜線
    • (?:R(?!C-[A-Z0-9]{2,6})|[ABCGIKLNPSUV]) - 在非捕獲組2的替代品:
      • R(?!C-[A-Z0-9]{2,6}) - R後面沒有與C-然後2-6大寫ASCII字母或數字
      • | - 或
      • [ABCGIKLNPSUV] - 1這些字母
  • (/RC-[A-Z0-9]{2,6})? - 可選第2組:
    • /RC- - 文字子串/RC-
    • [A-Z0-9]{2,6} - 2到6個大寫ASCII字母或數字。