如何从多行字符串输出中获取多个字符串实例
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));
我的输出字符串采用这种多行格式。我需要获取 "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));