2009-10-19 53 views

回答

34

是的,正則表達式可以爲你做的:

"HelloWorldMyNameIsCarl".replaceAll("(.)([A-Z])", "$1_$2") 

表達[A-Z]將每一個大寫字母匹配,放入第二組。您需要第一組.以避免替換第一個「H」。

由於Piligrim指出,此解決方案不適用於任意語言。爲了捕獲由Unicode標準定義的任何大寫字母,我們需要匹配所有大寫字母的Unicode 4.1 subproperty\p{Lu}。所以更一般的解決方案看起來像

"HelloWorldMyNameIsCarl".replaceAll("(.)(\\p{Lu})", "$1_$2") 

謝謝Piligrim。

+0

打敗我吧。我不記得Java正則表達式替換是\ 1還是$ 1,所以我不得不查看它。 – 2009-10-19 21:20:07

+3

請注意,此解決方案(與ChssPly76給出的解決方案不同)不適用於所有大寫字母,但僅適用於英文版本:僅缺少所有大寫字母。 – Henning 2009-10-19 21:41:24

+1

我認爲他的例子字符串意味着英語。 – 2009-10-19 22:55:02

2

這裏有一個提示,讓你沿着一個可能的解決方案在想:

  1. 查找分裂串入部分在每個大寫字母
  2. 加入分割字符串回到了他們
  3. 之間下劃線的方式

有用的關鍵詞:

  • 分裂
  • 正則表達式/正則表達式
+1

這是一個生動的證明,這個報價真的很棒:http://stackoverflow.com/questions/58640/great-programming-quotes/58646#58646 :-) – ChssPly76 2009-10-19 21:11:17

+0

你有什麼反對正則表達式,ChssPly76? – 2009-10-19 21:22:12

+0

String.split刪除匹配的(=分割)字符,因此在這裏沒有真正的幫助。 – Henning 2009-10-19 21:34:22

3

這個功課?爲了讓你開始:

  1. 創建一個StringBuffer
  2. 遍歷您的字符串。
  3. 檢查每個字符是否爲大寫(java.lang.Character類有幫助)
  4. 如果是,則將下劃線追加到緩衝區。
  5. 將當前字符追加到緩衝區。
+0

分裂或正則表達式看起來更自然。 – 2009-10-19 21:10:58

+0

他甚至要求正則表達式。 – 2009-10-19 21:11:28

+0

+1 - 這對我來說似乎是一個完美可行的解決方案(特別是如果這是家庭作業)。 – 2009-10-19 21:12:24

相關問題