如何从多行字符串输出中获取多个字符串实例

How can I get multiple instances of string from multi line string output

我的输出字符串采用这种多行格式。我需要获取 "Detection Date:" 和 "Confidence " 之间的日期。有多个实例,它们出现的行不是恒定的。

abcd efg hijk
xxxxx: yyyyy
zzzz:aaaa
bbbb
ccc
Detection Date:
**01/20/2015**
Confidence:
mmmm:nnnn
oooo
abcd 
xxxxx: yyyyy
ccc
Detection Date:
**01/25/2015**
Confidence:
mmmm:nnnn
oooo
ppppp
qqqq:
rrrr

我尝试了以下方法。我将多行输出转换为单行(我认为这会有所帮助)但无济于事

for (int i = 3; i < getDates.size()-47; i++) {
            String strDateFrmRslt = getDates.get(i).getText();
            System.out.println("The LENGTH of the text is  "+ strDateFrmRslt.length());
            strDateFrmRslt=strDateFrmRslt.replaceAll("[\r\n]+", " ");

            Pattern p = Pattern.compile(" Detection Date:([^>]*) ");                
            Matcher m = p.matcher(strDateFrmRslt);


            while (m.find()) {

                  System.out.println(m.group());
                }

        } 

这是我得到的输出。它到达检测日期的第一个实例的开头,然后抓取所有内容。我只需要“01/20/2015”和“01/25/2015”

The LENGTH of the text is  763
Detection Date: 01/20/2015 Confidence:  mmmm:nnnn oooo abcd  xxxxx: yyyyy ccc Detection Date: 01/25/2015 Confidence:

感谢查看...

您可以查看 this 示例并通过使用 Pattern.DOTALL | Pattern.MULTILINE 标志来表示我提供的示例中的 ms 标志来实现 Java 等效项。

这应该使您的 while(m.find() 循环工作。

或者,如果您知道您的标记将自己排在一行上,您可以简单地查找它们并使用布尔标志。写的时间可能会长一些,但我想最终的结果会更清晰。

蛮力法但你能不这样做吗:

String[] stringParts = inputString.split("\r?\n");
ArrayList<String> foundDates = new ArrayList<String>();
for (int i = 0; i<stringParts.length; i++) {
if (stringParts[i].equals("Detection Date") && stringParts[i + 2].equals("Confidence")) {
    foundDates.add(stringParts[i + 1]);
    }
}

假设您可以解析带有换行符的多行字符串,您正在将检测日期之后的所有字符串添加到列表中。

你可以这样做:

    strDateFrmRslt  = strDateFrmRslt .replaceAll("[\r\n]+", "");
    Pattern pattern = Pattern.compile("Detection Date:\*\*(\d\d/\d\d/\d\d\d\d)\*\*Confidence");
    Matcher matcher = pattern.matcher(strDateFrmRslt);
    while(matcher.find())
        System.out.println(matcher.group(1));