【问题标题】:Java Best way to extract parts from a stringJava从字符串中提取部分的最佳方法
【发布时间】:2014-08-08 21:23:31
【问题描述】:

我有以下字符串;

[Username [rank] -> me] message

等级、用户名和消息的字符每次都会有所不同。我可以将其分解为三个单独的变量(用户名、排名和消息)的最佳方法是什么?

我已经尝试过:

String[] parts = text.split("] ");

但它正在抛出错误。提前致谢!

【问题讨论】:

  • 您能否更具体地说明哪些字符可以和不能作为分隔符出现?所有字符串都会有这个精确的符号序列作为分隔符吗?
  • 任何字符都可以在消息中,但用户名和排名只能是字母数字。所有变量的长度都会有所不同。我想如果你可以修剪用户名和排名,你就会得到消息。
  • 那些字符串周围的符号呢?可以是什么? (这就是我所说的分隔符。)
  • 喜欢括号和箭头?无论如何,这将永远是一样的。
  • 它给你带来了什么错误?

标签: java regex


【解决方案1】:

使用 Java 对正则表达式的支持 (java.util.regex) 并让正则表达式匹配这 3 个部分。

比如这个:^\[([\w]+) \[([\w]+)\] -> \w+\] (.*)$

Java 代码 sn-p,略微改编自 Ian F. Darwin 的“Java Cookbook”(O'Reilly):

import java.util.regex.*;

class Test
{
    public static void main(String[] args)
    {
        String pat = "^\\[([\\w]+) \\[([\\w]+)\\] -> \\w+\\] (.*)$";
        Pattern rx = Pattern.compile(pat);
        String text = "[Username [rank] -> me] message";
        Matcher m = rx.matcher(text);
        if(m.find())
        {
            System.out.println("Match found:");
            for(int i=0; i<=m.groupCount(); i++)
            {
                System.out.println("  Group " + i + ": " + m.group(i));
            }
        }
    }
}

输出:

Match found:
  Group 0: [Username [rank] -> me] message
  Group 1: Username
  Group 2: rank
  Group 3: message

【讨论】:

  • 工作得很好,谢谢!
【解决方案2】:
String input = "[whatever [Is] -> me] Input";
String user, rank, message;

user = input.substring(1, input.indexOf('[', 1));
rank = input.substring(input.indexOf('[', 1), input.indexOf(']'));
message = input.substring(input.lastIndexOf(']'));

这应该可以,但是如果您真的希望它正确完成,您应该创建一个单独的对象来保存所有这些并可以将其作为字符串输出。取决于它来自哪里以及去向。 -轴突

【讨论】:

  • 使需要解析的行的格式更复杂一点,你很快就会得到极其复杂和不灵活的代码。如果实际消息包含 ] 字符,那么代码的最后一行就会出现问题。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2012-02-29
  • 2011-04-02
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多