我的输出字符串采用此多行格式。我需要获得介于"检测日期之间的日期:"和"信心"。有多个实例,它们出现的行不是常量。
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:
感谢您查看...
答案 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));