【问题标题】:Regex Captures in Java like in C#Java 中的正则表达式捕获,就像在 C# 中一样
【发布时间】:2011-09-08 18:19:12
【问题描述】:

我需要使用 Java 重写现有 C#/.NET 程序的一部分。我对 Java 不是很流利,并且缺少一些处理正则表达式的东西,只是想知道我是否缺少某些东西,或者 Java 是否只是不提供这样的功能。

我有类似的数据

2011:06:05 15:50\t0.478\t0.209\t0.211\t0.211\t0.205\t-0.462\t0.203\t0.202\t0.212

我使用的 Regex 模式如下所示:

?(\d{4}:\d{2}:\d{2} \d{2}:\d{2}[:\d{2}]?)\t((-?\d*(\.\d*)?)\t?){1,16}

在 .NET 中,我可以使用 match.Group[3].Captures[i] 访问匹配后的值。

在 Java 中我还没有找到类似的东西。 matcher.group(3) 只返回一个空字符串。

我怎样才能实现像我在 C# 中习惯的那种行为?

【问题讨论】:

  • 应该是一样的。编译你的模式,匹配,就是这样。 java 正则表达式只是普通的正则表达式。我很想说“检查您的输入”等。
  • 问题是在进行多值组拟合时,(something)*(something){1,16},Java 只返回拟合中的最后一个拟合项。所以我想在你的情况下,第 1 组是 2011:06:05 15:50,第 2 组是 0.212,就是这样。
  • @toto:没错,这就是问题所在。此外,我可以在多值组周围加上一些括号,例如((something){1,16})。然后我得到整个字符串(something){1,16} 匹配,即0.478\t0.209\t0.211\t0.211\t0.205\t-0.462\t0.203\t0.202\t0.212。但随后我必须再次拆分生成的字符串。这不是我认为正确的方法......
  • 看我的回答。这是我认为唯一的出路。但我希望被证明是错误的,并希望看到有人提出更优雅的答案。

标签: java c# regex capture regex-group


【解决方案1】:

正如我在 cmets 中提到的,Java 只会返回多值组拟合的最后一个值。因此,您应该首先使用正则表达式将字符串的最后一部分与值隔离:

strg = "0.478\t0.209\t0.211\t0.211\t0.205\t-0.462\t0.203\t0.202\t0.212"

然后围绕标签拆分:

String[] values = strg.split("\\t");

【讨论】:

  • 是的,到目前为止,这是我的临时解决方案。也在等待更好的解决方案... ;)
  • @signpainter:.NET 和 Perl 6 是目前唯一支持捕获重复组的正则表达式实现。因此,如果您使用的是 Java,则此解决方案别无选择。
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2019-10-05
  • 2013-11-20
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多