2010-06-02 90 views
3

把這些例子如何獲取字符串中的第二個單詞?

Smith John 
Smith-Crane John 
Smith-Crane John-Henry 
Smith-Crane John Henry 

我想的空間後拿到John 的第一個字,但它可能不是直到最後,也可以是直到非字母字符。 Java 1.5會如何呢?

+1

在你的第三個例子中是正確的輸出「John」或「John-Henry」? – jasonmp85 2010-06-02 20:53:21

+0

約翰............ – Pentium10 2010-06-02 20:54:30

+4

WTF是「可能的」 - 家庭標籤? – 2010-06-02 21:00:15

回答

5

您可以使用正則表達式和Matcher類:

String s = "Smith-Crane John-Henry"; 
Pattern pattern = Pattern.compile("\\s([A-Za-z]+)"); 
Matcher matcher = pattern.matcher(s); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

結果:

 
John 
+0

+1,但我會使用'group(1)',否則它會返回整個比賽,包括前導空格。 – BalusC 2010-06-02 20:59:45

+0

謝謝....更新。 – 2010-06-02 21:00:43

+0

如果該人的姓名是Hélenè,該怎麼辦?使用'\ p {L}'來匹配所有的Unicode字母,而不是使用'[A-Za-z]'。 – jasonmp85 2010-06-02 23:44:13

1

你會想要使用正則表達式,像下面這樣。

\s{1}[A-Z-a-z]+ 

Enjoy!

+0

你會捕獲什麼?因爲當名字中出現空格或連字符時,這可能不起作用。 – Pran 2010-06-02 20:59:27

+0

Hi Pran, 是的,恰恰相反,這個表達式的內容如下 - 找到第一個出現的單個空格,然後是空格後面的一個或多個alpa字符。所以它會查找字母串中是否跟隨連字符的簽名天氣。正如你所看到的,馬克·比爾斯在他的回答中使用了我的表達。 – Doug 2010-06-02 21:10:53

4

你可以使用String.split

line.split(" "); 

這對於第一行會產生:

{ "Smith", "John" } 

然後,您可以迭代這個數組找到它。如有必要,您還可以使用正則表達式作爲分隔符。

這是否足夠好,還是你需要更強大的東西?

+0

雖然在第三個例子上失敗。他想要得到「約翰」,而不是「約翰亨利」。 – BalusC 2010-06-02 20:53:53

+0

如果它只能識別來自John-Henry的約翰 – Pentium10 2010-06-02 20:54:07

+0

並不確定原始作者是否打算抓取輸入中的特定項目,但如果您使用Split作爲Justin建議的,則使用equalsIgnoreCase來測試項目是否爲您正在尋找的特定物品。 – predhme 2010-06-02 20:57:28

1

個人而言,我真的很喜歡這個字符串標記。我知道這是過時了,這些天,分這麼簡單,所有的,但是......

(因爲家庭作業的高概率的僞碼)

create new string tokenizer using (" -") as separators 
iterate for each token--tell it to return separators as tokens 
    if token is " " 
     return next token; 

完成。

+0

也許把它放在blockquote而不是代碼示例中,以避免語法突出顯示 – Patrick 2010-06-02 21:11:07

+0

StringTokenizer是如此2006. :-)根據Javadoc的說法,StringTokenizer是一個遺留類,由於兼容性原因而保留,儘管它在新代碼中的使用不受歡迎。建議任何尋求此功能的人都使用String或java.util.regex包的拆分方法。' – corsiKa 2010-06-02 21:14:43

+0

@glowcoder我無法弄清楚如何分割來做tokenizer自然做的事情 - 將分隔符作爲記號返回。 – 2010-06-03 20:08:54

相關問題