使用正则表达式正确分组

时间:2010-08-06 08:59:04

标签: regex

我有一个正则表达式,其中包含一个命令列表。但我不知道它背后是什么样的参数,所以它可以是一个字符串或数字或什么都不是 并且有可能,我不知道命令。

在我的第一个版本中没有任何字符串,因此(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

感谢您的帮助。

2 个答案:

答案 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”之间“切断”字符串的标准究竟是什么?