Java 从字符串中检索单词

Java 从字符串中检索单词,java,string,Java,String,我有一句话: (ADDRESS = (PROTOCOL = XXX)(HOST = YYY)(PORT = ZZZ)) 我需要检索主机名称,在本例中为YYY 我不知道它是用小写字母还是大写字母写的,甚至是它们的混合体。 因此,我通过line.toUpperCase()将整行切换为大写,然后根据HOST=分割行,并选择字符,直到得到),这表示主机名的结尾 我相信有更好的办法。如有任何提示,将不胜感激 我的代码: String host = ""; line = line.toUpperCase(

我有一句话:

(ADDRESS = (PROTOCOL = XXX)(HOST = YYY)(PORT = ZZZ))
我需要检索
主机
名称,在本例中为
YYY

我不知道它是用小写字母还是大写字母写的,甚至是它们的混合体。 因此,我通过
line.toUpperCase()
将整行切换为大写,然后根据
HOST=
分割行,并选择字符,直到得到
,这表示主机名的结尾

我相信有更好的办法。如有任何提示,将不胜感激

我的代码:

String host = "";
line = line.toUpperCase();
int i = line.indexOf("HOST");
while(line.charAt(i)!='=')
    i++;
while(line.charAt(i)!=')') {
    i++;
    if(line.charAt(i)!=')'&&line.charAt(i)!=' ')
       host = host + line.charAt(i);
}
return host;
那么:

String host = line.toUpperCase().split("HOST = ")[1].split(")")[0];

您可以使用apache.commons

试一试

你为什么不使用StringUtils呢

substringBetween(str,"(HOST=",")");

此代码将为您提供主机名,在任何情况下都是字符串(大写、小写或混合)


str将是整个字符串。。。您无需将整个字符串转换为大写或小写…:)

您只需要主机。好啊 但是在regex中有一个步骤,您可以使用:

Pattern p = Pattern.compile("\\s*\\(ADDRESS\\s*=\\s*\\(\\s*PROTOCOL\\s*=\\s*(\\w+)\\s*\\)\\s*\\(\\s*HOST\\s*=\\s*(\\w+)\\s*\\)\\s*\\(\\s*PORT\\s*=\\s*(\\d+)\\s*\\)\\s*\\)\\s*");
Matcher m = p.matcher("(ADDRESS = (PROTOCOL = http)(HOST = localhost)(PORT = 8080))");
if(m.matches()){
    System.out.println("protocol = "+m.group(1));
    System.out.println("host = "+m.group(2));
    System.out.println("port = "+m.group(3));
}

只要字符串的格式保持不变,解决方案就简单得多:

line.split("\\)\\(")[1].split("=")[1].trim();

此外,在这种情况下,字符串的大小写并不重要

如果要匹配
,为什么要做所有小写和大写的事情?我不匹配
。我需要在
主机
单词旁边找到该单词,该单词不能保证为小写/大写。但我知道这个词的结尾是“')。你的方法似乎很合理。很好。我想我可以通过
line.toUpperCase().contains(stringToCheck.toUpperCase())
来实现这一点。。您将如何准确地“检索本例中为YYY的主机名”?我太迷路了…@ManuelMiranda仍然没有。。这样,我只得到包含
HOST
单词的那一行。。(我已经做了,但问题中没有提到)非常优雅。我还没有想到正则表达式的解决方案。谢谢,即使
=
已连接到
主机
,是否也有办法实现此功能?(
HOST=YYY
)如果
HOST
是用小写(
HOST
)写的,这将不起作用。有人能对我的解决方案发表意见吗?你的建议会有帮助。问题是道具的顺序可能不同,例如(主机=YYY)(协议=XXX)(端口=ZZZ):(道具的顺序)不是问题中的标准您是对的,它不存在,从这个意义上说,您的解决方案运行良好。但其他解决方案允许参数重新排序,这无论如何都是好的。我认为此解决方案在给定场景下也是独立于大小写的。实际上,我看到它是关于Oracle Addrees配置字符串的,它在ny订单,所以我甚至不认为重新订购是否符合要求
String[] st= str.split("=");
        String[] st2= st[3].split("\\)\\(");
        System.out.println("Host name::"+st2[0]);
Pattern p = Pattern.compile("\\s*\\(ADDRESS\\s*=\\s*\\(\\s*PROTOCOL\\s*=\\s*(\\w+)\\s*\\)\\s*\\(\\s*HOST\\s*=\\s*(\\w+)\\s*\\)\\s*\\(\\s*PORT\\s*=\\s*(\\d+)\\s*\\)\\s*\\)\\s*");
Matcher m = p.matcher("(ADDRESS = (PROTOCOL = http)(HOST = localhost)(PORT = 8080))");
if(m.matches()){
    System.out.println("protocol = "+m.group(1));
    System.out.println("host = "+m.group(2));
    System.out.println("port = "+m.group(3));
}
line.split("\\)\\(")[1].split("=")[1].trim();