用于在括号中提取逗号分隔数字的正则表达式

时间:2016-04-21 11:39:18

标签: php regex

字符串:

lorem ipsum 999
[id:284,286]
[id:28]

括号内的块可能包含很多数字。

正则表达式:

\[id:(\d+)(,\d+)*\]

我想看到的内容:

284
286
28

使用PHP的解决方案:

preg_match_all('/\[id:(.*)\]/', $input, $ids);
if (strpos($ids[1][0], ',')) {
    $ids = explode(',', $ids[1][0]);
    foreach ($ids as $id) {
        echo $id . "\n";
    }
} else {
    echo $ids[1][0];
}

但是可以使用正则表达式而不爆炸()?

1 个答案:

答案 0 :(得分:1)

Sub Save() 'To break links to Ultra-D ActiveWorkbook.BreakLink Name:="H:\JUNK\Quotes\Al Costing\Ultra-D\Ultra-D.xlsx", Type:=xlExcelLinks 'To Save Range("D8").Select ActiveCell.FormulaR1C1 = "=NOW()" Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("D7").Select Dim Proposal As String Dim Customer As String Dim System As String Proposal = Range("D3").Value Customer = Range("D4").Value System = Range("D5").Value ActiveWorkbook.SaveAs Filename:= _ "C:\Users\walkerja\Desktop\Al Quotes\" & Proposal & " " & Customer & " SCR-Al-" & System & " Tsoc.xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False End Sub 方式也许是最好的方式。不幸的是,PCRE不记得重复的组,因此,您要么分两步(使用explode),要么使用基于explode的正则表达式。这是一个比你正在使用的更正确的正则表达式(如果数字之间没有空格):

\G

请参阅IDEONE demo

$input = "lorem ipsum 999 [id:284,286] [id:28]"; preg_match_all('~\[id:([\d,]*)]~', $input, $ids); foreach ($ids[1] as $id) { print_r(explode(',', $id)) . PHP_EOL; } 正则表达式与'~\[id:([\d,]*)]~'匹配,然后匹配并捕获到第1组零或更多(由于[id: 0+次出现量词)数字({ {1}})或* s。

如果你需要one-regex解决方案,在PHP中,如果你处理个人字符串,你可以使用基于\d的正则表达式,你可以利用它来设置领先边界然后匹配连续的数字:

,

请参阅regex demo和此IDEONE demo

\G

模式详情

  • '~(?:\[id:|(?!^)\G,)\K\d+~' - 将$re = '~(?:\[id:|(?!^)\G,)\K\d+~'; $strs = array("lorem ipsum 999", "[id:284,286]", "[id:28]"); foreach ($strs as $s) { preg_match_all($re, $s, $matches); print_r($matches[0]); } 文字字符序列或每个成功匹配的结尾与(?:\[id:|(?!^)\G,)后面的逗号匹配
  • [id: - 省略匹配的值
  • (?!^)\G - 仅匹配1+位数

如果数字之间可能有空格,请在逗号之后(可能在之前)添加\K