java中的复杂字符串提取

时间:2011-04-30 08:44:55

标签: java regex

我正在使用java中的diff库,它输出带有方括号的diffs,其中存在多个相同类型的diff,并且对于只有一个diff存在的diffs没有方括号。

多重差异的一个例子是“Diff(4,L3,L4,L5,L6,119LNS),[)”和“Diff(2,R43,R46,51k),[2,R44,R47,10k” ],[2,R45,R48,1k],[)“。单个差异的示例是“Diff(PBSS306NZ,135)”和“Diff(4,L3,L4,L5,L6,119LNS),[]”。

我希望从字符串中提取差异,如“4,L3,L4,L5,L6,119LNS”而不是“Diff(4,L3,L4,L5,L6,119LNS),[]”和我看过这里的一些问题试图做类似的事情,但这些问题的正则表达式没有做我需要的。我试过“\ [[^ \]] \]”和“\ [。?\] +”,但它们不起作用。任何正则表达专家的帮助将不胜感激。

我已在https://rapidshare.com/#!download|869l36|460197924|regextest.txt|1

上传了一个示例输出文件

3 个答案:

答案 0 :(得分:2)

我相信这可以满足您的需求:

File file = new File("regextest.txt");
StringBuilder sb = new StringBuilder();
Scanner scanner = new Scanner(file).useDelimiter("\n");
while (scanner.hasNext()) {
    String line = scanner.next();
    line = line.replaceAll("^Diff\\(", "");
    line = line.replaceAll("\\)$", "");
    sb.append(line);
}
String combined = sb.toString();

Pattern pattern = Pattern.compile("\\[.+?\\]");
Matcher matcher = pattern.matcher(combined);
while (matcher.find()) {
    String extract = combined.substring(matcher.start(), matcher.end());
    extract = extract.replaceAll("\\[ ?", "");
    extract = extract.replaceAll(" ?\\]", "");
    System.out.println(extract);
}

对于regextest.txt文件,输出如下:

12, C1,C4,C5,C6,C9,C10,C15,C18,C19,C20,C23,C24, C0603, 10nF
10, C2,C3,C7,C8,C13,C16,C17,C21,C22,C27, C0603, 100nF
2, C11,C25, SMT, 1uF LOW ESR 50V
4, C12,C14,C26,C28, C0805, 2u2
4, D1,D2,D4,D9, SOT23, BAS40-04/SOT
4, D3,D5,D6,D7, SMB, SMBJ5.0A
1, D8, SMB, SMBJ15A
2, D10,D11, SMB, SMBJ30A
1, J1, SMT, CON12
2, L1,L2, SMT, 744043471, 470uH
4, L3,L4,L5,L6, 119LNS
...

答案 1 :(得分:1)

伯纳德,

我想这可能包含一些指针,我想这可能会让你走上正确的轨道。

package forums;

public class RegexTest2
{
  public static void main(String[] args) {
    try {
      final String expected = "4, L3,L4,L5,L6, 119LNS";
      String actual = "Diff(4, L3,L4,L5,L6, 119LNS ], [ )"
        .replaceAll("^Diff\\(( \\], \\[ )?", "")
        .replaceAll("[\\[\\], )]*$", "");
      assert expected.equals(actual) : actual;
      //System.out.println("Correct result: "+actual);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

是的,那里有很多猜测......因为我不知道你想要匹配什么...而且可能更重要的是:你想要的一切都不匹配。< / p>

干杯。基思。


编辑:现在,我想起来了,我们正在使用一把锤子可以做的炸弹......那就是:我们正在尝试使用REGEX(一般情况下)目的模式匹配器)当我们真正想要的只是一个简单的&#34;从字符串的开头和结尾删除任何和所有这些字符。当然是一个&#34;定制&#34;方法将是一种更清晰的方法,即使它的代码更多。

答案 2 :(得分:0)

伯纳德,

关于您对WhiteFang34最优秀答案的评论中的其他问题。

www.regular-expressions.info

http://www.regular-expressions.info/是地球上最强大的网络资源。 它们涵盖所有正则表达式,对详细工作的正确,可访问的解释示例 ......

在许多情况下,覆盖范围比作者原始文档更好(尤其是Java,尤其如此)。它们涵盖了支持正则表达式的所有语言,是公正的。

另外:Checkout那里的工具部分:他们有一个交互式正则表达式测试器。 使用IT 任何时候您需要开发一个非肤浅的正则表达式。想想“正则表达式的IDE”。这很神奇(恕我直言)。我刚刚发现了自动正则表达式发生器,它似乎甚至可以工作。

无论如何,该网站是一个上帝发送,只是为了清楚解释。

干杯。基思。