Java 正则表达式不一致的组
Java Regex inconsistent groups
请参考以下关于SO的问题:
我的正则表达式组不一致。我的代码如下所示:
public class RegexTest {
public static void main(String[] args) {
// final String VALUES_REGEX = "^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]*))*\}$";
final String VALUES_REGEX = "\{([\w.-]+)(?:, *([\w.-]+))*\}";
final Pattern REGEX_PATTERN = Pattern.compile(VALUES_REGEX);
final String values = "{df1_apx.fhh.irtrs.d.rrr, ffd1-afp.farr.d.rrr.asgd, ffd2-afp.farr.d.rrr.asgd}";
final Matcher matcher = REGEX_PATTERN.matcher(values);
if (null != values && matcher.matches()) {
// for (int index=1; index<=matcher.groupCount(); ++index) {
// System.out.println(matcher.group(index));
// }
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
}
我尝试了以下组合:
A) 正则表达式为 "^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" 并使用 groupCount() 进行迭代。结果:
df1_apx.fhh.irtrs.d.rrr
ffd2-afp.farr.d.rrr.asgd
B) 正则表达式为 ^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" 并使用 matcher.find()。结果:无结果。
C) 正则表达式为 "\{([\w.-]+)(?:, ([\w.-]+))\}" 并使用groupCount() 进行迭代。结果:
df1_apx.fhh.irtrs.d.rrr
ffd2-afp.farr.d.rrr.asgd
D) 正则表达式为 "\{([\w.-]+)(?:, ([\w.-]+))\}" 并使用matcher.find()。结果:无结果。
我从来没有得到一致的群体。这里的预期结果是:
df1_apx.fhh.irtrs.d.rrr
ffd1-afp.farr.d.rrr.asgd
ffd2-afp.farr.d.rrr.asgd
请告诉我,我该如何实现。
(?<=[{,])\s*(.*?)(?=,|})
您可以简单地使用它并获取 captures.See 演示。
https://regex101.com/r/sJ9gM7/33
当你有 (#something)*
时,正则表达式只会记住最后一组 engine.You 不会以这种方式获得所有组。
问题是你试图同时做两件事:
- 您要验证字符串格式
- 您想提取每个项目(项目数量未知)
因此,无法使用 matches 方法,因为当您重复相同的捕获组时,先前的捕获会被最后一个覆盖。
一种可能的方法是使用 find 方法获取每个项目并使用邻接锚 \G
检查格式。 \G
确保当前匹配紧跟在前一个或字符串的开头:
(?:\G(?!\A),\s*|\A\{)([\w.-]+)(}\z)?
图案详情:
(?: # two possible begins:
\G(?!\A),\s* # contiguous to a previous match
# (but not at the start of the string)
| # OR
\A\{ # the start of the string
)
([\w.-]+) # an item in the capture group 1
(}\z)? # the optional capture group 2 to check
# that the end of the string has been reached
因此,要从头到尾检查字符串的格式,您只需要测试最后一个匹配项是否存在捕获组 2。
请参考以下关于SO的问题:
我的正则表达式组不一致。我的代码如下所示:
public class RegexTest {
public static void main(String[] args) {
// final String VALUES_REGEX = "^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]*))*\}$";
final String VALUES_REGEX = "\{([\w.-]+)(?:, *([\w.-]+))*\}";
final Pattern REGEX_PATTERN = Pattern.compile(VALUES_REGEX);
final String values = "{df1_apx.fhh.irtrs.d.rrr, ffd1-afp.farr.d.rrr.asgd, ffd2-afp.farr.d.rrr.asgd}";
final Matcher matcher = REGEX_PATTERN.matcher(values);
if (null != values && matcher.matches()) {
// for (int index=1; index<=matcher.groupCount(); ++index) {
// System.out.println(matcher.group(index));
// }
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
}
我尝试了以下组合:
A) 正则表达式为 "^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" 并使用 groupCount() 进行迭代。结果:
df1_apx.fhh.irtrs.d.rrr
ffd2-afp.farr.d.rrr.asgd
B) 正则表达式为 ^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" 并使用 matcher.find()。结果:无结果。
C) 正则表达式为 "\{([\w.-]+)(?:, ([\w.-]+))\}" 并使用groupCount() 进行迭代。结果:
df1_apx.fhh.irtrs.d.rrr
ffd2-afp.farr.d.rrr.asgd
D) 正则表达式为 "\{([\w.-]+)(?:, ([\w.-]+))\}" 并使用matcher.find()。结果:无结果。
我从来没有得到一致的群体。这里的预期结果是:
df1_apx.fhh.irtrs.d.rrr
ffd1-afp.farr.d.rrr.asgd
ffd2-afp.farr.d.rrr.asgd
请告诉我,我该如何实现。
(?<=[{,])\s*(.*?)(?=,|})
您可以简单地使用它并获取 captures.See 演示。
https://regex101.com/r/sJ9gM7/33
当你有 (#something)*
时,正则表达式只会记住最后一组 engine.You 不会以这种方式获得所有组。
问题是你试图同时做两件事:
- 您要验证字符串格式
- 您想提取每个项目(项目数量未知)
因此,无法使用 matches 方法,因为当您重复相同的捕获组时,先前的捕获会被最后一个覆盖。
一种可能的方法是使用 find 方法获取每个项目并使用邻接锚 \G
检查格式。 \G
确保当前匹配紧跟在前一个或字符串的开头:
(?:\G(?!\A),\s*|\A\{)([\w.-]+)(}\z)?
图案详情:
(?: # two possible begins:
\G(?!\A),\s* # contiguous to a previous match
# (but not at the start of the string)
| # OR
\A\{ # the start of the string
)
([\w.-]+) # an item in the capture group 1
(}\z)? # the optional capture group 2 to check
# that the end of the string has been reached
因此,要从头到尾检查字符串的格式,您只需要测试最后一个匹配项是否存在捕获组 2。