Java 带有分组和lookarounds的高级正则表达式

Java 带有分组和lookarounds的高级正则表达式,java,regex,Java,Regex,好的,我想在java正则表达式的帮助下,将某些赋值从字符串中分成若干组 我的字符串如下所示: LogEventDefinition( logEvent = LogEvent.MESSAGE700, process = process.Data, processStep = "action") group 1 group 2 logEvent LogEvent.MESSAGE700 process process.Data processStep action 我

好的,我想在java正则表达式的帮助下,将某些赋值从字符串中分成若干组

我的字符串如下所示:

LogEventDefinition(
logEvent = LogEvent.MESSAGE700,
process = process.Data,
processStep = "action")
group 1      group 2
logEvent     LogEvent.MESSAGE700
process      process.Data
processStep  action
我的最终解决方案应将其分组如下:

LogEventDefinition(
logEvent = LogEvent.MESSAGE700,
process = process.Data,
processStep = "action")
group 1      group 2
logEvent     LogEvent.MESSAGE700
process      process.Data
processStep  action
我的想法是:

(?=@LogEventDefinition\()(\w+)\s=(\s\w+)\(?:\s\w+\。(\w+)\)


我先做一个前瞻性检查,然后从上的第一个括号检查字符串LogEventDefinition的以下内容。基本上,这是完全错误的,尝试了一些其他尝试,但没有任何效果,将非常感谢您的帮助

我认为您甚至可以在不设置正式正则表达式的情况下处理此问题:

String input  = "LogEventDefinition(";
       input += "logEvent = LogEvent.MESSAGE700,";
       input += "process = process.Data,";
       input += "processStep = \"action\")";

input = input.replaceAll("\\w+\\((.*)\\)", "$1");  // remove function wrapper
String[] parts = input.split(",\\s*");             // split terms by comma
List<String> group1 = new ArrayList<>();
List<String> group2 = new ArrayList<>();

for (String part : parts) {
    group1.add(part.split("\\s*=\\s*")[0]);        // assign group1 term
    group2.add(part.split("\\s*=\\s*")[1]);        // assign group2 term
}

System.out.println("group1, group2");
for (int i=0; i < group1.size(); ++i) {
    System.out.println(group1.get(i) + ", " + group2.get(i));
}
此处演示:

group1, group2
logEvent, LogEvent.MESSAGE700
process, process.Data
processStep, "action"

我认为要实现这一点,你需要的不仅仅是正则表达式。我可以知道你为什么要用正则表达式吗?也许一个简单的代码可以在没有正则表达式的情况下生成这个输出。基本上是因为设计的软件需要它,至少一个用于提取这些精确模式的正则表达式最终会大大减少扩展代码中的混乱。请始终记住,如果在非常大的字符串或文件上使用正则表达式,则可能会导致效率损失。“软件设计需要它”-您可能希望对此进行详细说明,因为这肯定有助于更好地理解需求。例如,Java正则表达式不支持将多个匹配捕获到一个组中,也就是说,您必须多次应用正则表达式。这是不是可行的方法取决于软件的功能——如果你可以自由使用一些代码,非正则表达式可能更容易理解。事实上,我确实意识到,只需在字符串中添加一些符号,然后重新提取列表中的部分或其他任何内容,这就容易多了,但问题是,由于编码限制,我必须为此找到一个正则表达式。如果java中不可能只对多个匹配项进行分组,那么我也可以不找到正则表达式。您在哪里发现在java中分组多个匹配项是不可能的?感谢Rextester,我来看看这个!好的,所以我找到了一个表达式来轻松地提取括号中的内容:
(?regex1->表达式上的regex1结果->regex2->regex1结果上的regex2结果是的,你可以使用正式的Java模式匹配器。但实际上我更喜欢使用
String#split
,因为它更简洁,更易于阅读。