【问题标题】:Regex capturing: get only result from second group正则表达式捕获:仅从第二组获取结果
【发布时间】:2020-04-23 15:23:26
【问题描述】:

我有以下字符串:

'pp_3', 365]

pp_ 之后的内容可能有不同的长度。 , 之后和] 之前的内容是我想要捕获的(并且只有它)。它的长度各不相同,但始终是一个数字。

我想出了(?<=pp_).*,(.*)(?=])。它给了3', 365 作为一个完整的匹配,在第1组有我想要的'365'。如何只获得 365 作为完整匹配项?

如果我无法解释我的疑问,请告诉我。谢谢

【问题讨论】:

  • 为什么你不能简单地介于 ,] 之间?我只会使用indexOfsubstring
  • 那为什么必须全场投注365?为什么不直接访问第一个捕获组?
  • @ScaryWombat 因为字符串比我显示的要大得多。

标签: java regex pattern-matching regular-language


【解决方案1】:

试试这个:

[^_]*_(\d*)'\s*,\s*(\-?\d+)\s*]. 

此正则表达式捕获 2 个组,它们对应于每个数字,第一个在 pp_ 之后,第二个在 ', 之后(可能是负数)。如果您不想将第一个捕获为一个组,而不是 (\d*),只需写 (?:\d*)

【讨论】:

  • 谢谢。你能否重写你的正则表达式,它只会捕获365'
  • 实际上,它只捕获365。你有没有尝试过?试一试,看看它是否按你想要的方式工作。
  • 是的,确实如此。第 1 组。8-11 365(取自您发送的链接)。
  • 我的正则表达式做你的。我的意思是365 完全匹配(不是分组)。
  • 好的,那么pp_ 后面的数字和,] 之间的数字有区别吗?他们中的任何一个都有一些属性,比如最大尺寸或类似的东西吗?它们都是数字,所以\d 会匹配两者。有没有办法区分它们?如果要捕获多个数字,则不能只匹配一个数字。
【解决方案2】:

要仅匹配数字并且如果您想使用积极的后向,您可以使用 Java 支持的后向中的量词(您可以自己指定)

(?<=pp_[^,]{0,1000}, )\d+(?=])

说明

  • (?&lt;= 正面向后看,断言左边是
  • pp_[^,]{0,1000}匹配pp_,匹配除,以外的任何字符0-1000次
  • , 匹配逗号和空格
  • ) 近距离观察
  • \d+ 匹配 1+ 位
  • (?=]) 正向前瞻,断言右边是]

在 Java 中

String regex = "(?<=pp_[^,]{0,1000}, )\\d+(?=])";

Java demo

您也可以使用捕获组:

pp_[^,]*, (\d+)]

Regex demo

【讨论】:

  • 它可以工作,但捕获的结果与我的完全相同。请看丹尼尔的回答——他的解决方案正是我想要的。
【解决方案3】:

试试这个表达式。第二组应该是你所追求的:

(?<='pp_)(\d*', )(\d*)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多