2015-11-15 42 views
1

我試圖分裂使用Java正則表達式這種類型的字符串:Java的正則表達式來解析路徑分成多個可選組

/api/vX/client/domain/category/id 

粗製濫造成這樣:

(?:/api)?(?:/vX)?(/client/domain/...)?(?:/category)?(?:...)? 

我將它分割成以下基團:

  • [0]/API
  • [1]/VX(1-x)的
  • [2]/client/domain(/ a/b/...)(以下分類)
  • [3]/category1 | /產品組別
  • [4] /一切

現在,我想我們這樣的正則表達式,但它只是不工作,我期待它的方式。

(\/api)?(\/v\d+)?(\/\w+)(\/category1|category2\/?.*)? 

我還需要考慮到尾隨/斜線開頭,並期望以斜槓開頭總是會啓動一個段,但結尾的斜線可能會或可能不會在那裏(除非有下一段)。

的路徑,我試圖實現輸出的一些例子是:

/client: 
[0], [1], [2]=/client, [3], [4] 

/api/client: 
[0]=/api, [1], [2]=/client, [3], [4] 

/api/v1/client/domain: 
[0]=/api, [1]=/v1, [2]=/client, [3], [4] 

/api/v1/client/domain/category1: 
[0]=/api, [1]=/v1, [2]=/client/domain, [3]=/category1, [4] 

api/v1/client/d1/d2/d3/category1: 
[0]=/api, [1]=/v1, [2]=/client/d1/d2/d3, [3]=/category1, [4] 

/api/v2/client/domain/category2/id: 
[0]=/api, [1]=/v2, [2]=/client/domain, [3]=/category2, [4]=/id 
+0

[看看Regexplanet](http://fiddle.re/ekebh6),想法也許有幫助。點擊Java。 –

回答

2

下面的正則表達式將匹配你定義了什麼:

^(/api)?(/v\d+)?(/[^/]+(?:/[^/]+)*?)??(?:(/category[12])(/.*)?)?$ 
  • ^行的開頭匹配
  • (/api)?組(可選)
  • (/v\d+)?組(可選)
  • (/[^/]+(?:/[^/]+)*?)??組匹配任意數量的組,對於客戶端,域等(可選)
  • (?:(/category[12])(/.*)?)?是一個可選non capturing group匹配:在組
    • (/category[12])類別1或2
    • (/.*)?組:別的(可選)
  • $ t他字符串的結尾(這點很重要,迫使懶惰匹配捕捉所有文本)

代碼

String text = "/api/v2/client/domain/category2/id"; 
String pattern = "^(/api)?(/v\\d+)?(/[^/]+(?:/[^/]+)*?)??(?:(/category[12])(/.*)?)?$"; 
Pattern regex = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); 
Matcher m = regex.matcher(text); 

while (m.find()) 
{ 
    System.out.println("api: " + m.group(1) + 
         "\nversion: " + m.group(2) + 
         "\nclient: " + m.group(3) + 
         "\ncategory: " + m.group(4) + 
         "\nextra: " + m.group(5)); 
} 

輸出

api: /api 
version: /v2 
client: /client/domain 
category: /category2 
extra: /id 

ideone demo