2011-11-09 134 views
1

我有一個輸入字符串,它將遵循模式/user/<id>?name=<name>,其中<id>是字母數字,但必須以字母開頭,而<name>是隻能包含多個空格的字母字符串。比賽的一些例子是:正則表達式不匹配由空格分隔的單詞

/user/ad?name=a a 
/user/one111?name=one ONE oNe 
/user/hello?name=world 

我想出了下面的正則表達式:

String regex = "/user/[a-zA-Z]+\\w*\\?name=[a-zA-Z\\s]+"; 

上述所有例子匹配正則表達式,但只着眼於<name>的第一個字。序列\s不應該讓我有空白?

,我提出來測試它是做什麼的代碼是:

String regex = "/user/[a-zA-Z]+\\w*\\?name=[a-zA-Z\\s]+"; 
// Check to see that input matches pattern 
if(Pattern.matches(regex, str) == true){ 
    str = str.replaceFirst("/user/", ""); 
    str = str.replaceFirst("name=", ""); 
    String[] tokens = str.split("\\?"); 
    System.out.println("size = " + tokens.length); 
    System.out.println("tokens[0] = " + tokens[0]); 
    System.out.println("tokens[1] = " + tokens[1]); 
} else 
    System.out.println("Didn't match."); 

因此,例如,一個測試可能是這樣的:

/user/myID123?name=firstName LastName 
size = 2 
tokens[0] = myID123 
tokens[1] = firstName 

,而所需的輸出將

tokens[1] = firstName LastName 

如何更改我的正則表達式來執行此操作?

回答

3

不知道你認爲你的代碼中存在什麼問題。 tokens[1]確實包含在您的示例中的firstName LastName

這是一個ideone.com demo顯示這一點。


但是,你有沒有考慮過使用捕獲組的id和名稱。

如果你把它寫像

String regex = "/user/(\\w+)\\?name=([a-zA-Z\\s]+)"; 

Matcher m = Pattern.compile(regex).matcher(input); 

您可以通過m.group(1)獲得myID123firstName LastName保持和m.group(2)

+0

小挑剔:這正則表達式也匹配以數字開頭的ID。 – Matt

+0

真的.. OP的不;)因爲它的作業標記,我會留下它作爲一個練習;) – aioobe

+0

哈哈,好吧,+1 :) – Matt

1

我不覺得在你的代碼的任何故障,但你可以捕捉組是這樣的:

String str = "/user/myID123?name=firstName LastName ";  
    String regex = "/user/([a-zA-Z]+\\w*)\\?name=([a-zA-Z\\s]+)"; 
    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(str); 
    if(m.find()) { 
     System.out.println(m.group(1) + ", " + m.group(2)); 
    } 
1

的問題是,*是默認的貪婪(它匹配整個ST環),所以你需要通過添加?修改您正則表達式(使之不願):

List<String> str = Arrays.asList("/user/ad?name=a a", "/user/one111?name=one ONE oNe", "/user/hello?name=world"); 
    String regex = "/user/([a-zA-Z]+\\w*?)\\?name=([a-zA-Z\\s]+)"; 

    for (String s : str) { 
     Matcher matcher = Pattern.compile(regex).matcher(s); 
     if (matcher.matches()) { 
      System.out.println("user: " + matcher.group(1)); 
      System.out.println("name: " + matcher.group(2)); 
     } 
    } 

輸出:

user: ad 
name: a a 
user: one111 
name: one ONE oNe 
user: hello 
name: world 
+0

也許我做了一些其他的錯誤,但這並沒有改變任何東西:(謝謝你的迴應,但! –

+0

您需要重構您的代碼並使用Matcher和Pattern類,如我的示例中所示。 – Matt

相關問題