字符串:
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];
}
但是可以使用正则表达式而不爆炸()?
答案 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
。