2017-04-14 114 views
-1

我的目的是找到所有的 「令牌」 和引用字符串與一個String :: split()方法:爲什麼這個java正則表達式返回false?

(("[\w\s]*")|(\w*))* 

輸入文本:

this "a test" abd "and more" 

它總是返回false。

另外,如何「引用」它,以便我可以在源代碼中使用它?

+0

在Java中,你不需要雙冒號來調用靜態函數:: xD –

+0

什麼是提醒人們split是String的簡寫呢?字符串#拆分? – pitosalas

+2

'String.split'返回'String []',所以我不確定它是如何返回false的。你可以用實際輸出顯示代碼和預期輸出嗎? – Dukeling

回答

1

String.split使用匹配作爲分隔符進行分割,即它返回不匹配匹配的所有內容。如果你想返回你正在匹配的內容,你應該使用Matcher.find

此外,\\w*匹配長度爲0的字符串,您可能想要避免。使用+來匹配1或更多。

你也有一些不必要的支架和外*不應該存在 - 正則表達式的其餘部分已經匹配所有的字符在單令牌和多令牌應該大概是整個正則表達式匹配的多個調用匹配(所以說「任何數量的這些「沒有意義)。

Matcher m = Pattern.compile("\"[\\w\\s]*\"|\\w+").matcher("this \"a test\" abd \"and more\""); 
while (m.find()) 
    System.out.println(m.group()); 

上面打印:

this 
"a test" 
abd 
"and more" 

要刪除的報價,你可以更新的正則表達式來使用look-around,這將檢查"的是有的,但實際上不會與它們匹配:

"(?<=\")\\w[\\w\\s]*(?=\")|\\w+" 

要了解如何逃脫的事情,你需要保持記住不同的層次。首先是Java本身,其中"將開始或結束一個字符串,因此如果您希望"字符出現在字符串中,需要使用\進行轉義。然後有正則表達式代碼,它預計\w\s,但Java不允許\沒有它被轉義,所以這是\\w\\s

+0

感謝您提供美麗,完整,工作和有益的答案:) – pitosalas