2015-01-13 91 views
1

我在匹配這種格式的字符串時遇到了一些麻煩:(foo "bar")。說得確切的說,我想捕捉Java中類Lisp的字符串匹配

  1. 左括號,其次是
  2. 零個或多個字符的空格,f.b.
  3. 至少一個單詞字符,f.b
  4. 空白再次,零或多個,f.b.
  5. 一個或多個單詞字符,用雙引號括起來,f.b
  6. 可選空白和右括號。

接下來我想提取foobar,但這是一個不同的問題。我設法得到的最好的是\([\s]? [\w]+ [\s]? \" [\w]+ \" [\s]? \),我一直在使用online resource來檢查我的正則表達式。

你能指出我的正則表達式有什麼問題嗎?

+0

「*錯了我的正則表達式*」嗯,這是你誰應該說明問題,你有它。然後,我們可以嘗試找到問題的原因和解決方案。 – Pshemo

+0

@Pshemo問題是正則表達式不符合給定的規範(步驟1-6);你也可以看看第一句中給出的例子。原因是我還沒有計算出正則表達式。解決辦法是要求SO上的指針;) – rath

+0

「*(包含符號)*」是什麼意思?你想在引號內接受哪些符號? – Pshemo

回答

0
  • 你不需要附上character classes\w\s[][\s]是一樣的\s(只有當你應該用[]括起來的情況下,當你想要創建單獨的字符類,它結合了現有的字符類,如[\s\d],它代表的字符是wh itespaces或數字)。
  • 此外,默認情況下空格包含在正則表達式中,因此"\s "將匹配兩個空格,一個用於\s,另一個用於
  • 零個或多個」由*表示,?代表零或一次
  • 如果你想要寫你的正則表達式爲字符串,您還需要通過之前

增加另一個\逃脫\因此,與下面的正則表達式"\\(\\s*\\w+\\s*\"[\\w]+\"\\s*\\)"代表

\\(  - 1. An opening parenthesis 
    \\s*  - 2. Zero or more whitespace chars 
    \\w+  - 3. At least one word character 
    \\s*  - 4. Whitespace again, zero or more 
    \"  - 5. opening quotation 
    \\w+  - 5. One or more char - I am not sure which symbols you want to add here 
       but you can for instance add them manually with [\\w+\\-*/=<>()]+ 
    \"  - 5. closing quotation 
    \\s*  - 6. Optional whitespace 
\\)   - 6. closing parenthesis 

現在,如果你想獲得一些嘗試部分匹配的文本可以使用groups(您想要與未轉義的括號匹配的環繞部分),就像正則表達式\\w+ (\\w+)一樣,它會找到一對單詞,但第二個單詞將放置在組中(索引1)。爲了獲得該組的內容,您只需要使用group(index)Matcher例如:

Pattern pattern = Pattern.compile("\\w+ (\\w+)"); 
Matcher matcher = pattern.matcher("ab cd efg hi jk"); 

while (matcher.find()) { 
    System.out.println("entire match =\t"+matcher.group()); 
    System.out.println("second word =\t"+matcher.group(1)); 
    System.out.println("---------------------"); 
} 

輸出:

entire match = ab cd 
second word = cd 
--------------------- 
entire match = efg hi 
second word = hi 
--------------------- 
1

您的正則表達式中有額外的空格字符導致模式不匹配。也不需要方括號。問號標記爲零或一個出現但不多於。要標記爲零或更多,您應該使用*。下面將匹配括號中的字符串和使用兩個匹配的組,兩組foobar

Pattern pattern = Pattern.compile("\\(\\s*(\\w+)\\s*\"(\\w*)\"\\s*\\)"); 
Matcher matcher = pattern.matcher("(foo \"bar\")"); 
if(matcher.find()) { 
    System.out.println(matcher.group(1)); // foo 
    System.out.println(matcher.group(2)); // bar 
}