Java 从多行字符串中提取文本

Java 从多行字符串中提取文本,java,android,regex,Java,Android,Regex,我有一个字符串MYSTRING和多行,如下所示: X:String1;;;; X1:String2 X2:3 YY1:4 我的目标是从上面的字符串中提取每个字符串。我发现以下公式: Pattern pattern = Pattern.compile("([\\n|;|:](X:|X1:)[0-9a-zA-Z-\\säöüÄÖÜß,]*[\\n|;])"); Matcher m = pattern.matcher(MYSTRING); if(m.find()) { String n

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

X:String1;;;;
X1:String2
X2:3
YY1:4

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

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);
}
有了上面的forumla,我成功地只得到了String1。
如何获取String2、String3等的其余部分?

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

首先执行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);
        }

这不是正确的方法,特别是如果你有很多字段,但至少对我来说只需查询两次就行了,可以被视为临时解决方案。

if
更改为
,而
迭代所有匹配的文本。但是你的正则表达式看起来不对。例如,类似于
[a | b]
的内容将表示并匹配sing
a
b
。管道(
|
)在
[…]
中没有任何特殊意义(它不是
操作符)。正如我所提到的,我只成功地匹配了第一个sting。它是X,但我不能匹配X1、X2或yyy1Maybe?是的,但正如前面提到的,您的正则表达式也会接受您不期望的字符。例如,
[…(X:| X1:)…]
将接受
X
|
X
(这是不需要的,因为字符类已经包含X)
(与
X
相同的问题,不再需要)和
。让我重复一遍:character类允许我们匹配一组字符中的单个字符,因此
[abc]
不会匹配整个
abc
,而是
a
b
c
,而不管它们的顺序如何。