2016-01-21 110 views
2

給定一個字符串S,找到該字符串中的字數。對於這個問題,一個單詞由一個或多個英文字母串組成。Java拆分正則表達式

注意:空格或任何特殊字符,如![,?。\ _'@ +]將作爲分隔符。輸入格式:該字符串只包含小寫英文字母,大寫英文字母,空格和這些特殊字符:![,?._'@ +]。

輸出格式:在第一行,打印字符串中的字數。這些詞不需要是唯一的。然後,在單獨的一行中打印每個單詞。

我的代碼:

Scanner sc = new Scanner(System.in); 
    String str = sc.nextLine(); 
    String regex = "(|!|[|,|?|.|_|'|@|+|]|\\\\)+"; 
    String[] arr = str.split(regex); 

    System.out.println(arr.length); 

    for(int i = 0; i < arr.length; i++) 
     System.out.println(arr[i]); 

當我提交的代碼,它工作的測試用例剛剛超過一半。我不知道測試用例是什麼。我正在尋求墨菲定律的幫助。我所實施的正則表達式不起作用的情況是什麼?

+4

爲什麼你包括你的正則表達式反斜線?這不符合要求。另外,你正在使用'['和']'而不逃避它們。 –

+3

對於在正則表達式中有特殊含義的字符,您需要將它們轉義。作爲一個附註,你可能會發現從一個字符集(例如,'[a-z]'是全部小寫字母的集合)而不是一系列X或Y或Z情況下拆分會更容易和更清晰。 – Vulcan

+0

我道歉。不知道我必須逃避反斜槓才能在此發佈。 – juice

回答

1

你不會在你的正則表達式中轉義一些特殊字符。我們從[]開始。既然你不逃避它們,[|,|?|.|_|'|@|+|]的部分被視爲一組字符|,?._'@+。這意味着您的正則表達式不會在[]之間分割。

例如x..]y+[z被分成x,]y[z

你可以通過轉義這些字符來解決這個問題。這將迫使你逃過更多的人,你最終有一個適當的定義:

String regex = "(|!|\\[|,|\\?|\\.|_|'|@|\\+|\\])+"; 

注意,而不是定義選擇,您可以使用一組,這將使你的正則表達式更容易閱讀:

String regex = "[!\\[,?._'@+\\].]+"; 

在這種情況下,您只需要轉義[]

UPDATE:

還有用(在你的例子".Hi?there[broski.]@@@@@"等)導致特殊字符的問題。你需要分割它,但它會在結果中產生一個空字符串。我不認爲有使用分割功能而不創造一種方式,但你可以通過使用相同的正則表達式分裂之前除去第一組減輕它:

String[] arr = str.replaceFirst(regex, "").split(regex); 
+0

我很感謝您的回覆。我做了一個「.Hi?there [broski。] @@@@@」的測試輸入,沒有引號。輸出打印出4,一個空行,嗨,那裏,broski(每個都有自己的行)。我認爲它打印出空白行,因爲'。'在「Hi」前面。我將如何解決這個問題? – juice

+0

是的,沒錯。查看我的更新。 – Szymon