我正在尝试在字符串中搜索数字/字符模式。
字符串看起来像这样
"any text CA-2019-6-000000 any text"
"any text KA 2019-2-929029" // note: no "-" between the "KA and 2019"
"KA-2019-11-929029"
我可以明确地说,总是有一个年份,例如2000/2019/2055
。
年份之后始终是一个负号,两个可能的数字是1-12,另一个是负号。
哪个月。
在“ -<num>-
”之后是一个6位数长的数字,该数字可以至少为000000
或最大为999999
在一年之前,最大值为两个字符长的字符串,后接减号。 在这两个字符之间,长而强的可能是减号或空格字母。
示例:
"AA 2019"
"ZZ-2018"
我发现我可以用/[0-9]{6}/
得到6个数字。
年份/[0-9]{4}
。我想补充一点,它只能在2000 and 2100
我可以使用/(?<=\-)(.*?)(?=\-)/
或
/\-(.*?)\-/
例如,我有个主意是查找两个“-”字符之间的数字并将其存储在变量中。 然后说,我要在此变量后的数字之间输入数字,该数字长6个字符,且介于000000和999999之间。
与该年相似的游戏。我想说的是,我得到的数字是变量前的“-”,最大长度是4个数字,介于2000和2100之间。
如果我随后将年份存储在变量中,则可以从理论上说我正在寻找“-$ yearvariable”或“ [space] $ yearvariable
之前的两个字母。答案 0 :(得分:1)
您可以使用
\b([A-Z]{2})[-\s](20[0-9]{2}|2100)-(0?[1-9]|1[0-2])-(\d{6})(?!\d)
请参见regex demo
详细信息
\b
-单词边界([A-Z]{2})
-两个大写字母[-\s]
-连字符或空格(20[0-9]{2}|2100)
-数字从2000到2100 -
-连字符(0?[1-9]|1[0-2])
-一个月(从1到12)-
-连字符(\d{6})(?!\d)
-6位数字(不超过7位)。请参见regex graph:
$s = "any text CA-2019-6-000000 any text";
if (preg_match('~\b([A-Z]{2})[-\s](20[0-9]{2}|2100)-(0?[1-9]|1[0-2])-(\d{6})(?!\d)~', $s, $m)) {
print_r($m);
}
输出:
Array
(
[0] => CA-2019-6-000000
[1] => CA
[2] => 2019
[3] => 6
[4] => 000000
)