1

在构建正则表达式字符串时,我迷失了方向。我需要一个执行以下操作的正则表达式。

我有以下字符串:

[~class:obj]
[~class|class2|more classes:obj]
[!class:obj]
[!class|class2|more classes:obj]
[?method:class]
[text]

一个字符串可以有多个上面的内容。示例字符串为“[if] [!class:obj]”

我想知道 [] 和分成匹配组之间的内容。例如,第一个匹配组将是符号(如果存在)(~|!|?)接下来是:之前的内容,因此可以是 class 或 class|class2|etc...然后是:右侧的内容和在 ] 之前停止。可能没有 : 以及它之前的内容,而只是 [] 之间的内容。

那么,我将如何编写这个正则表达式呢?是否可以给出匹配组名称以便我知道它匹配什么?

这是一个java项目。

先谢谢了。

4

4 回答 4

1

如果您对自己的输入有足够的把握,您可能可以使用类似/\[(\~|\!|\?)?(?:((?:[^:\]]*?)+):)?([^\]]+?)\]/. (要将其翻译成 Java,您需要转义反斜杠并使用引号而不是正斜杠)

于 2012-07-24T19:36:31.867 回答
1

我相信这应该有效:

/[(.*?)(?:\|(.*?))*]/

还:

[a-z]*
于 2012-07-24T19:37:26.403 回答
1

试试这个代码

final Pattern
  outerP = Pattern.compile("\\[.*?\\]"),
  innerP = Pattern.compile("\\[([~!?]?)([^:]*):?(.*)\\]");
for (String s : asList(
    "[~class:obj]",
    "[if][~class:obj]",
     "[~class|class2|more classes:obj]",
     "[!class:obj]",
     "[!class|class2|more classes:obj]",
     "[?method:class]",
     "[text]"))
{
  final Matcher outerM = outerP.matcher(s);
  System.out.println("Input: " + s);
  while (outerM.find()) {
    final Matcher m = innerP.matcher(outerM.group());
    if (m.matches()) System.out.println(
       m.group(1) + ";" + m.group(2) + ";" + m.group(3));
    else System.out.println("No match");
  }
}
于 2012-07-24T19:40:31.727 回答