php preg_match-搜索特定的数字/字符代码

时间:2019-07-01 12:01:39

标签: php regex preg-match

我正在尝试在字符串中搜索数字/字符模式。

字符串看起来像这样

"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

之前的两个字母。

1 个答案:

答案 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

enter image description here

enter image description here

PHP demo

$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
)