3

我有这条线:

(ADDRESS = (PROTOCOL = XXX)(HOST = YYY)(PORT = ZZZ))

我需要检索HOST在这种情况下的名称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;
4

7 回答 7

4

您可以使用 apache.commons StringUtils.containsIgnoreCase(Str)

 StringUtils.contains("abc", "A"); //returns true 
于 2013-01-15T12:45:13.540 回答
3

尝试

    String s= "(ADDRESS = (PROTOCOL = XXX)(HOST = YYY)(PORT = ZZZ)) }";
    String host = s.replaceAll("^.+\\((HOST|host) *= *(.+?)\\).+$", "$2");      
于 2013-01-15T12:57:09.467 回答
3

关于什么:

String host = line.toUpperCase().split("HOST = ")[1].split(")")[0];
于 2013-01-15T12:44:55.527 回答
1

为什么不使用StringUtils 的substringbetween()

substringBetween(str,"(HOST=",")");
于 2013-01-15T13:00:35.430 回答
1

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

String[] st= str.split("=");
        String[] st2= st[3].split("\\)\\(");
        System.out.println("Host name::"+st2[0]);

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

于 2013-01-15T13:23:07.337 回答
0

就你的字符串格式保持不变而言,解决方案非常简单:

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

此外,在这种情况下,字符串的大小写无关紧要!

于 2013-01-15T14:25:50.927 回答
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));
}
于 2013-01-15T14:09:54.007 回答