我有一个正则表达式,其中包含一个命令列表。但我不知道它背后是什么样的参数,所以它可以是一个字符串或数字或什么都不是 并且有可能,我不知道命令。
在我的第一个版本中没有任何字符串,因此(abc|def|[a-z]+)([0-9]*)
工作正常。但现在我也想允许字符串。 (abc|def|[a-z]+)([0-9]*|[a-z]*)
不起作用。
字符串1:abc20def20ghi20
字符串2:abcdddef20ghi20
字符串3:abcdddef2d0ghi20abcdd
字符串1:
正则表达式1的示例: abc20 *** def20 *** ghi20
正则表达式2的示例: abc20 *** def20 *** ghi20
字符串2:
正则表达式1的示例: abc *** dddef20 *** ghi20
正则表达式2的示例: abc *** dddef20 *** ghi20
我希望得到以下结果: abc20 *** def20 *** ghi20 和 abcdd *** def20 *** ghi20
感谢您的帮助。
答案 0 :(得分:1)
根据您的最新评论,也许这会为您解决问题:
(abc|def)(\d+|(?:(?!(?1))[a-z])+)?|((?:(?!(?1))[a-z])+)((?2))?
EDIT。哎呀,意思是编辑我以前的答案,而不是发布新答案。
测试案例:
<?php
$r = '#(abc|def)(\d+|(?:(?!(?1))[a-z])+)?|((?:(?!(?1))[a-z])+)((?2))?#';
$s1 = 'abc20def20ghi20';
$s2 = 'abcdddef20ghi20';
$s3 = 'abcdddef2d0ghi20abcdd';
preg_match_all($r, $s1, $m1);
preg_match_all($r, $s2, $m2);
preg_match_all($r, $s3, $m3);
var_dump($m1[0], $m2[0], $m3[0]);
输出:
array(3) {
[0]=>
string(5) "abc20"
[1]=>
string(5) "def20"
[2]=>
string(5) "ghi20"
}
array(3) {
[0]=>
string(5) "abcdd"
[1]=>
string(5) "def20"
[2]=>
string(5) "ghi20"
}
array(5) {
[0]=>
string(5) "abcdd"
[1]=>
string(4) "def2"
[2]=>
string(2) "d0"
[3]=>
string(5) "ghi20"
[4]=>
string(5) "abcdd"
}
如您所见,它可以正确捕获两个字符串中的所有部分。
答案 1 :(得分:0)
你总是想要捕获长度为5的字符串吗?如果是这样,你可以这样做:
([a-z]{3})([0-9a-z]{2})
如果没有,也许你可以澄清在“abcdd”和“def20”之间“切断”字符串的标准究竟是什么?