2010-06-02 131 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

相关问题