【问题标题】:Multiple capture groups - all optional多个捕获组 - 全部可选
【发布时间】:2013-05-20 17:05:10
【问题描述】:

我知道这个(或类似的)已经被问过一百次了——但我现在真的需要帮助 :D 正则表达式应匹配的字符串。

注意:nINTEGER_MIN - INTEGER_MAX 的范围内

{number}
{number(1-n)}
{number(1-n,-n-n)}
{number(1-n,-n-n,0-n)}

如果模式匹配,则应生成 3 个单独的捕获组,结果如下。 所有组都应该是可选的 - 这样如果在例如 Java 中请求它们返回 null。

1: 1-n
2: -n-n
3: 0-n

我尝试过的:

\{number(?:\(([1-9])(?:(?:,)([0-9])){0,2}\))?\}

这显然不对,只包含 2 个组 (m.groupCount())

【问题讨论】:

  • “该数字不应有特定限制”是什么意思?你能举例说明什么应该匹配吗?
  • @Jerry {number(1,-4,11111)}{number(2322,231123,0)} 应该匹配。给出的数字不应小于INTEGER_MIN 且大于INTEGER_MAX。我将更新问题以表示这一点。
  • 你的问题不清楚,所以你想在做 regex o_o 的同时做一些计算?
  • 我得到了一个给定的占位符“{number(..,..,..)}”。这个占位符最多可以有 3 个参数 - 不需要!之后每个参数都被考虑到动态替换,这是在我的 java 代码中完成的。我可以使用 4 个单独的模式 - 但我确信 1 会这样做。
  • 所以here 是我想出的,希望这是你想要的...

标签: regex optional-parameters regex-group


【解决方案1】:

好的,根据我的推断,我会这样做:

\{number(?:\((\-?\d+)(?:\,(\-?\d+))?(?:\,(\-?\d+))?\))?\}

然后对捕获的组进行操作,以验证整数的范围,例如...

[伪代码,因为我不知道你用的是什么语言]

captured integers = "capture1", "capture2", "capture3"
if{("capture1" < "capture2" && "capture1" > "capture3") ||
   ("capture1" > "capture2" && "capture1" < "capture3")} {

    Do something

} else {

    Do something else; like reject or throw error

}

【讨论】:

  • 不匹配 {number(1)}{number(1,-12)}。我正在使用java。太糟糕了,我知道我要改变什么 - 但正则表达式一如既往地失败......
  • @DennisFischer 哦,这些也是可选的吗?编辑了正则表达式。 And tested.
  • 差不多了。对于我的使用,我添加了数量限制:\{number(?:\(([1-9]\d*)(?:\,(\-?\d+))?(?:\,([0-9]\d*))?\))?\}
  • @DennisFischer \d 等价于[0-9] =P
  • 没错。我会改变它。但是减号是不需要的:D
猜你喜欢
  • 2012-09-22
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多