【问题标题】:Java Regex Groups within groups组内的 Java 正则表达式组
【发布时间】:2017-02-04 14:09:37
【问题描述】:

一个小时以来,我一直在努力使用正则表达式。所以,就在这下面是我要解析的文本。

AddAgenda("Gangster's agenda", 
{ 
    TEAM_HITMAN, 
    TEAM_POLICE
}, 
{   
    TEAM_GANG,
    TEAM_MAFIA,
    TEAM_GANGSTER
})

我想从每对花括号中单独捕获议程名称。要知道的一件事是,我不知道每一对都有多少团队。

基本上,我想要这个:

Group [1]:
    Gangster's agenda
Group [2]:
    Group [0]: TEAM_HITMAN
    Group [1]: TEAM_POLICE
Group [3]:
    Group [0]: TEAM_GANG
    Group [1]: TEAM_MAFIA
    Group [2]: TEAM_GANGSTER

但我只是想出了这个:

AddAgenda\(\"([^"]+)\",\s*\{(\s*([\w_]+,))*

产生这个:

Group [0]:
    [0]: AddAgenda("Gangster's agenda", 
{ 
    TEAM_MOB, 
    TEAM_POLICE,
Group [1]:
    [0]: Gangster's agenda
Group [2]:
   [0]:  
    TEAM_POLICE,
Group [3]:
    [0]: TEAM_POLICE,

【问题讨论】:

  • 只需编写一个解析器,它会读取输入的每一部分并提取所需的值。你试过了吗?
  • 我从来没有理解过用正则表达式做这样的事情的魅力。只需编写您要解析文本的代码。为什么要让它变得不必要的复杂和难以辨认?
  • @nhouser9 我认为问题在于人们发现了正则表达式,然后假设它是处理文本的唯一工具。你知道,everything looks like a nail.
  • 从某种意义上说,这只是出于好奇。我想知道是否有可能只用一个正则表达式来实现这一点。

标签: java regex regex-group


【解决方案1】:

This my try:

AddAgenda\(\"([^"]+)\",\s*\{(\s*([\w_]+)\s*,?\s*([\w_]+)\s*)},\s*{\s*(([\w_]+)\s*,?\s*([\w_]+)?\s*,?\s*([\w_]+)?)\s*}\s*\)

所以看看你的问题,第 2 组包含第 3,4 组,第 5 组包含第 6,7,8 组(TEAM_GANG、TEAM_MAFIA、TEAM_GANGSTER)。

我们只使用一个正则表达式的问题是您无法为每个 TEAM 自动生成新的捕获组。需要明确的是,正则表达式的一个特性是您可以将量词应用于模式。 \d+ 吃掉更多的数字。例如,正则表达式 (\d) 将一个数字捕获到第 1 组中。

如果你把这两者放在这个正则表达式中会发生什么?

(\d)+

您在模式中看到的捕获括号仅捕获单个组。所以在 (\d)+ 中,捕获组不会继续重复匹配。正则表达式再次重复引用同一组。如果您在 1234 上尝试 (\d)+ 正则表达式,则第 1 组将包含最后一次捕获的 4

简而言之,每次正则表达式遍历捕获括号时,第 1 组都会被覆盖。

使用两个正则表达式,您可以将问题分成两部分。首先匹配AddAgenda中的三个参数。然后将花括号中的两个参数分开。

First regular 表达式可以是:

AddAgenda\("([^"]+)",\s*\{\s*([^}]+)\},\s*\{\s*([^}]+)\s*\}\)

Second regular expression很简单。

([\w_]+)

在这种情况下,在java中你可以执行以下代码:

Matcher m = Pattern.compile("[\\w_]+").matcher(s);
while (m.find()) {
    System.out.println(m.group());
}

【讨论】:

  • 感谢您的回答,但如果我添加/删除团队,您的正则表达式将不再起作用。
  • 我已经更新了我的答案,这个版本可以处理丢失的团队。
  • 还是没有按预期工作,nvm我就用2个正则表达式代替。
  • 我再次更新了我的答案,这个版本解释了为什么你不能在同一个正则表达式中重复捕获组。
【解决方案2】:

这样的?

\"(.*)\"|\s([A-Z_].*)

https://regex101.com/r/6vJpXe/1

【讨论】:

  • 感谢您的回答,但问题是我无法区分每个团队属于哪些组。
猜你喜欢
  • 2012-01-23
  • 2013-07-31
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2014-08-17
相关资源
最近更新 更多