首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于在ArrayList中查找特定线索的Regex

用于在ArrayList中查找特定线索的Regex
EN

Stack Overflow用户
提问于 2015-08-21 02:19:59
回答 2查看 79关注 0票数 0

我有一个字符串数组列表,我想找到

代码语言:javascript
复制
//results.getOptions() is an ArrayList<String>

Integer counter = 0;
for ( String option : results.getOptions() ) {
   System.err.println( "Item "+counter+" :"+option );
   counter++;
}

这段代码的输出是:

代码语言:javascript
复制
Item 0 :<ET>read input: 11.844ms</ET>
Item 1 :<ET>import: 2069.9ms</ET>
Item 2 :<ET>calc: 23.022ms</ET>
Item 3 :<ET>decompress .tax: 5.451ms</ET>
Item 4 :<ET>decrypt .tax: 4.409ms</ET>
Item 5 :<ET>load .tax formsets: 7.929ms</ET>
Item 6 :<ET>There were 4 calc errors:
Item 7 :F941 0 ZIP 0 - <Error><FormCd>INWKS941</FormCd><Level>Fatal</Level><Source>Company</Source><Entity>50-7754170</Entity><Category>CompanyInfo</Category><Message>Zip code is invalid.  You must enter a valid ZIP code for your state.  Enter a correct ZIP code in this format 'nnnnn' or 'nnnnn-nnnn'.</Message></Error>.
Item 8 :F941 0 STATE 0 - <Error><FormCd>INWKS941</FormCd><Level>Fatal</Level><Source>Company</Source><Entity>50-7754170</Entity><Category>CompanyInfo</Category><Message>State abbreviation is invalid.  Enter your two-letter postal state abbreviation.</Message></Error>.
Item 9 :F941 0 L11 0 - <Error><FormCd>INWKS941</FormCd><Level>Fatal</Level><Source>Company</Source><Entity>50-7754170</Entity><Category>Calculation</Category><Message>Total taxes after adjustments does not equal the total quarter liability on Schedule B.  You must make the necessary adjustments to reconcile the amounts.</Message></Error>.
Item 10 :F941 0 L15 0 - <Error><FormCd>INWKS941</FormCd><Level>Informational</Level><Source>Company</Source><Entity>50-7754170</Entity><Category>FormInfo</Category><Message>There is a balance due on this form of $6567.78.</Message></Error>.
Item 11 :: 0.034ms</ET>
Item 12 :<ET>write FormML: 8.739ms</ET>
Item 13 :<ET>flush FormML: 0.602ms</ET>
Item 14 :<ET>copy FormML to output vector: 1.763ms</ET>
Item 15 :<ET>convert: 2147.71ms</ET>
Item 16 :<ET>write output: 0.782ms</ET>
Item 17 :<FORMSET id="FORMML"/>
Item 18 :<DATA size="247750"/>
Item 19 :<ERROR code="0"/>
Item 20 :

我想捕获以以下内容开头的文本(索引)行:

代码语言:javascript
复制
<ET>There were 4 calc errors:

并以以下方式结束:

代码语言:javascript
复制
</ET>

(项目6-11来自产出)

我用什么正则表达式来捕捉这些特定的线条。我有一段Java代码,它将返回索引,但是捕获这些行的正则表达式是什么呢?

代码语言:javascript
复制
List<String> getMatchingStrings(List<String> list, String regex) {

  ArrayList<String> matches = new ArrayList<String>();

  Pattern p = Pattern.compile(regex);

  for (String s:list) {
    if (p.matcher(s).matches()) {
      matches.add(s);
    }
  }

  return matches
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-21 02:51:17

首先,正则表达式对单个字符串进行操作,因此您必须将单独的字符串组合起来。你可能想把他们当作线人,这样就行了。

代码语言:javascript
复制
StringBuilder buf = new StringBuilder();
for (String option : results.getOptions()) {
    buf.append(option).append("\r\n");
}

接下来,您需要一个跨多行工作的正则表达式,因此需要DOTALL选项(“在dotall模式下,表达式。匹配任何字符,包括行终止符”)。

另外,您需要正则表达式是“不情愿”的,与“贪婪”相反,所以您需要.*?,而不是.*,并且您希望捕获开始模式和结束模式之间的文本,因此需要捕获组()

代码语言:javascript
复制
String regex = "<ET>There were 4 calc errors:(.*?)</ET>";
Pattern p = Pattern.compile(regex, Pattern.DOTALL);
Matcher m = p.matcher(buf.toString());
while (m.find()) {
    String errorText = m.group(1);
    // Use errorText here
}

当然,如果没有确切的4个错误,您可以使用以下方法:

代码语言:javascript
复制
String regex = "<ET>There were \\d+ calc errors:(.*?)</ET>";

捕获的文本将以换行符开始,因此您可以trim()错误文本,也可以添加到模式中。

代码语言:javascript
复制
String regex = "<ET>There were \\d+ calc errors:\r\n(.*?)</ET>";
票数 1
EN

Stack Overflow用户

发布于 2015-08-21 02:31:40

如果您试图使用regex分别匹配列表中的每个字符串:

regex \\<ET\\>There were 4 calc errors:.*\\</ET\\>应该可以工作。因为特殊字符是转义的,并且.*匹配标记之间的所有字符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32131404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档