首页 > 解决方案 > 匹配带有 1 个或多个尾随子字符串的字符串

问题描述

我有这样的输入

[d/D/d1/d2/d3/d4/d5/d6/d7/D1/D2/D3/D4/D5/D6/D7]+[\.]+[r1/r2/r3/r4/r5/r6/R1/R2/R3/R4/R5/R6]+[\.]+[number 1 to 37]+[#]+[number 0 - 9 ]

一个例子是“d2.r1.4#100.37#1.9#2.3#1(可以有尽可能多的 1-37 # 0-9 根据需要)”

我如何编写一个正则表达式匹配,它可以允许字符串的最后一部分是动态的(根据输入的需要匹配尽可能多的组)

我试过这个表达:

[dD1-7]+\.[rR1-5]+\. 

而且我不确定如何匹配“d2.r1”之后的动态组。部分。

标签: phpregex

解决方案


假设您只需要验证字符串(而不是捕获/提取特定子字符串),以下模式提供与 Emma 的答案相同的结果,但语法更严格。

i模式修饰符意味着您只需将两个字母写成小写。我不使用任何多余的非捕获组。两个字符的字符类不需要连字符。 \d是更短的表达方式[0-9]

将最终/重复字符括在括号中然后写入*意味着括号中的序列可以重复零次或多次。

代码:(演示

$inputs = [
    'd2.r1.4#100.37#1.9#2.3#1',
    'd2.r1.4#100.37#1.9#2.38#1.8#22',
    'd2.r1.4#100.37#1.9#2.3#1.12#2.30#2',
];

$pattern = '/^d[1-7]\.r[1-6](?:\.(?:3[0-7]|[12]\d|[1-9])#\d+)*$/i';

foreach ($inputs as $input) {
    echo "\n{$input}: ";
    var_export((bool)preg_match($pattern, $input));
}

输出:

d2.r1.4#100.37#1.9#2.3#1: true
d2.r1.4#100.37#1.9#2.38#1.8#22: false
d2.r1.4#100.37#1.9#2.3#1.12#2.30#2: true

推荐阅读