【问题标题】:Simplify regex match groups with capturing [duplicate]通过捕获简化正则表达式匹配组
【发布时间】:2016-02-10 14:46:15
【问题描述】:

我正在尝试匹配此类字符串(5 个不同的字符串)。

|n||0||0||0||0|
|n||n||0||0||0|
|n||n||n||0||0|
|n||n||n||n||0|
|n||n||n||n||n|

其中n是可变的,但其他零是常数,n也不可能是零。

我需要得到这样的结果,因为我使用替代运算符 https://regex101.com/r/vE9hL4/1 进行了硬编码

我需要捕获 '| 中的所有数字|'就像我的正则表达式一样。 请帮忙简化一下。

【问题讨论】:

  • 恐怕我迷路了。为什么不爆炸呢?并在 || 上爆炸每行获取一个数组?你想从中得到什么?包含所有 5 行的单个数组,或者每行一个数组,或者只是将结果作为字符串,或者?
  • 我也迷路了。 |1||0| 和有什么区别和 |0||0|?
  • 所以可能会有像|n||0||0||n||0| 这样的实例,但不应该匹配,因为零不连续?
  • 这些天孩子们的家庭作业多么有趣。
  • 感谢您的回答似乎正确的方法是爆炸数组。

标签: php regex preg-match regex-lookarounds regex-greedy


【解决方案1】:

首先,我会进行匹配;一个或多个由管道字符包围的正数,可选地后跟由管道字符包围的零。

$subject = '|12||13||56||1||0|';
$re = '/^((?:\|[1-9]\d*\|)+)(?:\|0\|)*$/';

如果匹配,您可以根据管道字符本身进行拆分:

if (preg_match_all($re, $subject, $matches)) {
    $numbers = preg_split('/\|/', $matches[1][0], -1, PREG_SPLIT_NO_EMPTY);
}

【讨论】:

  • 真棒代码+1 ...你能解释一下你的答案吗?我很想看看正则表达式是如何分解的。
【解决方案2】:

抱歉没有看问题的一部分,这是我修改后的答案...

^\|([0-9]*)\|(?:\|(0)\|\|(0)\|\|(0)\|\|(0)\||(?:\|([1-9]*)\|\|(0)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|)|)$

https://regex101.com/r/mW5bN4/1

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多