【问题标题】:Using regular expressions to identify nodelists使用正则表达式识别节点列表
【发布时间】:2015-08-14 17:15:27
【问题描述】:

以下信息应拆分为两个数组:

  • foo089,bar[120-123,215]

所需的结果是两个数组,其中包含所有列出的数字 [089] 和 [120-123,215](更好的是 120,121,122,123 而不是 120-123,这是可选的)。

其他需要解析的例子:

  • foo[133,370,390-391],bar120
  • foo123
  • bar145
  • 酒吧[121,303]
  • foo123,bar145

这些都应该产生一个双元素数组(第一个是 foo,第二个是 bar),可以是单个条目(例如 123 或 145)或范围(例如 133,370,390-391 或 121,303)。

我总是需要两个数组,方便判断数字是属于foo还是bar。

限制

  • foo 或 bar 不必存在
  • 如果两者都存在,它们总是有序的
  • 数字总是有 3 位数字
  • 只有foo和bar,没有别的词
  • foo234,foo425 是不允许的。如果 foo 或 bar 有多个数字,则将其列在括号中

到目前为止,我尝试了以下正则表达式:\d{3}|foo\d{3}|bar\d{3}|\d{3}-\d{3}。 但是,使用 php 中的 preg_grep 我没有得到想要的结果。

【问题讨论】:

    标签: php regex


    【解决方案1】:
    ^(?!foo\d{3},bar\d{3})(?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?,?(?:bar(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?$
    

    现在在匹配结果中,第一组是foo 的号码,第二组是bar 的号码。

    解释:

    1. (?:\d{3}(?:-\d{3})? - 三位数三位数破折号三位数
    2. (?:\d{3}(?:-\d{3})?,?)+ - 以上重复多次,可能用逗号隔开
    3. \[(?:\d{3}(?:-\d{3})?,?)+\] - 相同但在方括号
    4. |\d{3} - 或者,只需 三位数字
    5. (?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))? 上述,但前面是 foo 并与 ? 成为可选
    6. ,? - 可选 comma 用于分隔 foobar
    7. bar 部分与 foo 部分几乎相同
    8. (?!foo\d{3},bar\d{3}) - 禁止 foo123,bar456 之类的东西
    9. ^$ - 从头到尾匹配

    See it in action here

    【讨论】:

    • 看起来不错!但是,我无法从 php.ini 中的字符串中提取信息。如何从这个正则表达式中得到两个数组?
    • 当您匹配时,第一组结果将是 foo 的数字,第二组结果将是 bar 的数字。又名foo089,bar[120-123,215],第一组返回089,第二组返回[120-123,215]
    猜你喜欢
    • 2012-03-01
    • 2023-01-16
    • 2019-01-06
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2018-02-16
    • 2011-10-02
    • 2012-01-02
    相关资源
    最近更新 更多