【问题标题】:Regex: Matching comma not followed by a number正则表达式:匹配逗号后不跟数字
【发布时间】:2014-02-05 14:11:48
【问题描述】:

我想从类似命令的字符串中提取一些组,格式如下:

  1. 富(酒吧,1)。 > 需要 'foo'、'bar' 和 '1'
  2. 富(酒吧,1.1)。 > 需要 'foo'、'bar' 和 '1.1'
  3. foo(bar-{foo,bar},1.1)。 > 需要 'foo'、'bar-{foo,bar}' 和 '1.1'

所以逗号可以出现在第一个参数中!

由于第二个参数总是以数字开头,我可以匹配第一个参数逗号后面不跟数字,但我不能用前瞻来做到:(

这是我目前的尝试:

(\w+)\(([a-zA-Z0-9_\-\{\}~]+)(,(\d+(\.\d+)?))?\)\.

...但示例 3 与此不匹配。

(\w+)\(([a-zA-Z0-9_\-\{\}~\,(?!\d)]+)(,(\d+(\.\d+)?))?\)\.

...这个不会让我捕捉到 > 2 组(负前瞻不会影响第一个逗号)

这是Debuggex example

任何帮助将不胜感激!非常感谢提前:)

【问题讨论】:

  • 什么样的符号可以否定逗号?只有{``}?你希望foo(bar[1,2],3) 发生什么?
  • 您使用哪种语言?
  • @SamSullivan:只有 {} 否定逗号。其他情况不会发生。
  • @Bohemian:我正在使用 java

标签: java regex regex-lookarounds


【解决方案1】:

这似乎可以解决问题:

(.*?)(?:\(|\)|,(?=\d))

Expl.: 匹配最多为 '(', ')' 或 ',' 后跟一个数字的任何内容。

如果您希望允许任意空格:

\s*(.*?)\s*(?:\(|\)|,(?=\d))\s*

使用全局标志获取所有实例。

问候

【讨论】:

  • 这确实有效,但我不确定我能否捕捉到不同的组(使用 Java)!谢谢你的回答 ClasG :)
【解决方案2】:

如果 {} 应该包含任何内容,那么这可能会起作用吗?

(\w+)\(([a-zA-Z0-9_\-~]+(\{.*\})?),(.+)\)\.

【讨论】:

  • 假设 {} 可以包含任何东西,我想说的是,这就像一个魅力,所以我接受这个答案:) 谢谢 Maciek
猜你喜欢
  • 2021-07-31
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多