0

我有一个像 '[1]-[2]-[3],[4]-[5],[6,7,8],[9]' 或 '[Computers]-[Apple]-[Laptop] 这样的字符串],[Cables]-[Cables,Connectors],[Adapters]',我希望 Pattern 得到列表结果,但不知道如何找出模式。基本上逗号是拆分,但 [6,7,8] 本身也包含逗号。

the string: [1]-[2]-[3],[4]-[5],[6,7,8],[9]
the result:
[1]-[2]-[3]
[4]-[5]
[6,7,8]
[9]

or

the string: [Computers]-[Apple]-[Laptop],[Cables]-[Cables,Connectors],[Adapters]
the result:
[Computers]-[Apple]-[Laptop]
[Cables]-[Cables,Connectors]
[Adapters]
4

3 回答 3

3
,(?=\[)

此模式在任何后面跟括号的逗号上拆分,但将括号保留在结果文本中。

(?=*stuff*)被称为“前瞻断言”。它充当匹配的条件,但它本身不是匹配的一部分。

在 C# 代码中:

String inputstring = "[Computers]-[Apple]-[Laptop],[Cables]-[Cables,Connectors],[Adapters]";
foreach(String s in Regex.Split(inputstring, @",(?=\[)"))
    System.Console.Out.WriteLine(s);

在 Java 代码中:

String inputstring = "[Computers]-[Apple]-[Laptop],[Cables]-[Cables,Connectors],[Adapters]";
Pattern p = Pattern.compile(",(?=\\[)"));
for(String s : p.split(inputstring))
    System.out.println(s);

要么产生:

[Computers]-[Apple]-[Laptop]
[Cables]-[Cables,Connectors]
[Adapters]
于 2013-03-23T04:47:13.657 回答
0

一个不使用正则表达式的答案(如果这有助于理解正在发生的事情)是:

  1. 替代品 ”],[”
  2. 在“@”上拆分
于 2013-03-23T04:53:13.643 回答
0

尽管我认为这里最好的方法是使用拆分(如@j__m 的回答所提出),但这是一种使用匹配而不是拆分的方法。

正则表达式:

(\[.*?\](?!-))

示例用法:

String input = "[Computers]-[Apple]-[Laptop],[Cables]-[Cables,Connectors],[Adapters]";
Pattern p = Pattern.compile("(\\[.*?\\](?!-))");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println(m.group(1));
}

结果输出:

[Computers]-[Apple]-[Laptop]
[Cables]-[Cables,Connectors]
[Adapters]
于 2013-03-23T05:51:48.107 回答