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

时间:2015-03-05 15:13:08

标签: java string selenium pattern-matching substring

我的输出字符串采用此多行格式。我需要获得介于"检测日期之间的日期:"和"信心"。有多个实例,它们出现的行不是常量。

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());
                }

        } 

这是我得到的输出。它到达检测日期的第一个实例的开头并在此之后抓取所有内容。我只需要&#34; 01/20/2015&#39;和&#39; 01/25/2015&#39;

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:

感谢您查看...

3 个答案:

答案 0 :(得分:1)

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

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

或者,如果你知道你的标记将自己在一条线上,你可以简单地查找它们并使用布尔标记。写作可能需要更长时间,但我认为最终结果会更清晰。

答案 1 :(得分:0)

蛮力方法,但你不能这样做:

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]);
    }
}

假设您可以使用换行符解析多行字符串,则会将“检测日期”后面的所有字符串添加到列表中。

答案 2 :(得分:0)

你可以这样做:

    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));