Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的复杂字符串提取_Java_Regex - Fatal编程技术网

java中的复杂字符串提取

java中的复杂字符串提取,java,regex,Java,Regex,我正在使用java中的一个diff库,该库输出带有方括号的diff,其中存在多个相同类型的diff,而对于只有一个diff的diff,没有方括号 多个diff的示例是“diff(4,L3,L4,L5,L6,119LNS)”、“diff(2,R43,R46,51k]、[2,R44,R47,10k]、[2,R45,R48,1k”)。单个diff的示例是“diff(PBSS306NZ,135)”和“diff(4,L3,L4,L5,L6,119LNS)” 我希望从字符串“4,L3,L4,L5,L6,11

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

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

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

我在Bernard上传了一个示例输出文件

我想这可能包含一些我想可能会让你沿着正确的轨道前进的指针

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();
    }
  }
}
是的,这里有很多猜测。。。因为我真的不知道你想匹配什么。。。也许更重要的是:所有你不想匹配的东西

干杯。基思



编辑:现在我想起来了,我们用的是一个炸弹,锤子可以。。。也就是说:我们正在尝试使用正则表达式(一种通用模式),而我们真正想要的只是简单地“从字符串的开头和结尾删除所有字符”。当然,“自定义”方法将是一种更干净的方法,即使它的代码多一点。

我相信这正是您想要的:

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
...
伯纳德

关于你在评论WhiteFang34最优秀答案时提出的附加问题

www.regular-expressions.info 是地球上最具地域性的网络资源。 它们涵盖了正则表达式的所有内容,并对详细的工作示例进行了正确、易访问的解释

在许多情况下,它们的覆盖范围比作者的原始文档要好(遗憾的是,Java的覆盖范围更广),而且它们公平地覆盖了所有支持正则表达式的语言

另外:在那里签出工具部分:他们有一个交互式正则表达式测试器。在需要开发非表面正则表达式的任何时候都可以使用它。想想“正则表达式的IDE”。它很神奇(IMHO)。我刚刚发现有一个自动正则表达式生成器,它似乎甚至可以工作

无论如何,这个网站是上帝派来的,只是为了解释清楚


Cheers.Keith.

Hmmm…我看了一下那个Diff文件。问题:哪个是一阶括号()还是[]?只是我看不到格式中的逻辑,我想知道是我,还是它只是一个非常混乱的格式…如果格式不好,我不愿意建议使用词法分析器(即,它不是词法;-)@corlettk正是我的想法。我自己也在试图找到解决这种随机性的方法。另外还有一个非常有趣的问题:)我想我明白你的意思了,从文件输出来看,它不是很清楚,但第一个差异是3行长,文件分隔符是一个换行符。第一个顺序括号是()。很好!请你解释\[.+?\]匹配?我会试一试,但如果我错了,请纠正我:一个“[”然后不情愿地(一个或多个字符)然后是一个“]”…是吗?这相当于“\[^\]+\]“,但更具可读性,是吗?你是对的,这是一个不情愿的匹配,在第一个
]
处停止。我相信它是等效的,而且看起来更具可读性。然而,当时我并没有想到这一点,这恰好是我所写的:)WhiteFang34,它工作得非常出色,我对它看起来多么干净印象深刻!你有没有学习java正则表达式的网络资源,我可以看看?再次欢呼:)嗨,科勒特克,谢谢你的指点。我昨天也有同样的想法,想写一个简单的“删除所有这些字符”,实际上我也尝试过这样做,但它会打开一整罐蠕虫,因为字符串并不总是有相同的结尾。regex测试文件有一个例子,其中一行以“[]])结尾,另一行以“[)”结尾,我想要一个健壮的东西来处理所有的排列。这就是为什么我认为regex可能会有帮助。你的解决方案也可以。谢谢你的帮助!@Bernard:我的字符剥离器类似于:从开始删除“[]中的所有字符,并从末尾删除“[],”中的所有字符,这将是一段相当简单的代码。它只需找到第一个“想要的”字符的索引,以及最后一个“想要的”字符的索引,然后返回一个子字符串(start,len)。