2016-04-29 88 views
3

我想寫一個算法來刪除由字符串中的大寫字符開始的每個字。在Scala中刪除由大寫字符開頭的字符串的字

例如:

原始字符串:「今天是星期五第29位。」

預期結果:「是第29位」。

我寫這個算法,但它是不完整的:

def removeUpperCaseChars(str: String) = { 
    for (i <- 0 to str.length - 1) { 
     if (str.charAt(i).isUpper) { 
     var j = i 
     var cont = i 
     while (str.charAt(j) != " ") { 
      cont += 1 
     } 
     val subStr = str.substring(0, i) + str.substring(cont, str.length - 1) 
     println(subStr) 
     } 
    } 
    } 

它(據說)刪除與大寫字符,而不是刪除只是用大寫字符開始的話每一個字。更糟糕的是,Scala並沒有給出任何結果。

任何人都可以幫我解決這個問題嗎?

回答

5

隨着一些假設,像話總是用空格分開,你可以這樣實現它:

scala> "Today is Friday the 29Th.".split("\\s+").filterNot(_.head.isUpper).mkString(" ") 
res2: String = is the 29Th. 

我們真的不想寫在你的斯卡拉做的方式的算法。這是一種方式,你會這樣做在C中。

+0

或只是'split(「+」)'允許任意數量的空格。 – ale64bit

+1

是的,我知道,或者更好'\\ s +',但加入單詞後,它總是會有一個空格,所以我們可能會丟失一些空格,這就是爲什麼我做了一個假設,但也許代碼會更好, \ S +。 –

+0

好吧,它比我想象的要簡單得多。謝謝,這正是我正在尋找的。 – undisp

1

string.replaceAll("""\b[A-Z]\w+""", "")

+0

你可能想要匹配word之後的空格,否則它會把他們留下''_is__the_29。'' –

+0

嗯,問題是刪除_words_,它沒有提及空白。 – Dima

+0

是的,但它仍然有一個聲明'期望的結果:「是第29。」':p –