2011-11-09 17 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

マイナーnitpick:この正規表現はまた、数字で始まるのIDと一致したが、リング)、あなたはそれが消極作る?()を追加して、正規表現を変更する必要がありそう。 – Matt

+0

真実.. OPはしません;それは宿題とタグ付けされているので、私は練習として残します;) – aioobe

+0

ハハ、ok、+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

関連する問題