【问题标题】:Extract Text from multi-line string从多行字符串中提取文本
【发布时间】:2019-11-12 13:36:58
【问题描述】:

我有一个多行的字符串 MYSTRING,如下所示:

X:String1;;;; X1:String2 X2:String3 YY1:String4

我的目标是从上面的字符串中提取每个字符串。我找到了以下公式:

Pattern pattern = Pattern.compile("([\\n|;|:](X:|X1:)[0-9a-zA-Z-\\säöüÄÖÜß,]*[\\n|;])");
Matcher m = pattern.matcher(MYSTRING);

if(m.find())  {
    String  name = m.group(1).substring(1);
}

通过上述论坛,我只成功获得了 String1。 如何获取 String2、String3、.....的其余部分?

【问题讨论】:

  • if 更改为 while 以遍历所有匹配的文本。但是您的正则表达式看起来不正确。例如[a|b] 之类的东西将代表和匹配唱歌a|b。管道(|)在[..] 内部没有任何特殊含义(它不是or 运算符)。
  • 如前所述,我成功匹配了第一个 sting,即 X,但我无法匹配 X1、X2 或 YY1
  • 是的,但如前所述,您的正则表达式也将接受您没有预料到的字符。例如[...(X:|X1:)...] 将接受(X:|X(这不是必需的,因为字符类已经包含X):(与X 相同的问题,它不再需要)和)。所以让我重复一遍:字符类允许我们匹配一组字符中的单个字符,所以[abc]不会匹配整个abcabc ,不管它们的顺序如何。

标签: java android regex


【解决方案1】:

我设法通过双重匹配查询来解决这个问题,如下所示:

首先执行 X 的查询

pattern = Pattern.compile("([\\n|;|:](X:)[0-9a-zA-Z-\\säöüÄÖÜß,]*[\\n|;])");
            m = pattern.matcher(MYSTRING);

        if(m.find())  {
            String  string1 = m.group(1).substring(1);
        }

然后执行 X1 的查询:

pattern = Pattern.compile("([\\n|;|:](X1:)[0-9a-zA-Z-\\säöüÄÖÜß,]*[\\n|;])");
            Matcher m = pattern.matcher(MYSTRING);

        if(m.find())  {
            String  string2 = m.group(1).substring(1);
        }

如果你有很多字段,这不是正确的方法,但至少它对我有用,只查询两次,可以被认为是临时溶胶。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多