Правильная группировка с регулярным выражением - PullRequest
0 голосов
/ 06 августа 2010

У меня есть регулярное выражение, которое включает в себя список команд.Но я не знаю, что это за параметр, поэтому это может быть строка, число или ничего.
И может быть, я не знаю команду.

В моей первой версии не было никаких строк, поэтому (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 ]

1 голос
/ 06 августа 2010

Исходя из вашего последнего комментария, возможно, это поможет вам:

(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"
}

Как видите, он корректно захватывает все части обеих строк.

0 голосов
/ 06 августа 2010

Вы всегда хотите захватывать строки, длина которых равна 5?Если это так, вы можете сделать это:

([a-z]{3})([0-9a-z]{2})

Если нет, может быть, вы можете уточнить, что именно является критерием для «вырезания» строки между «abcdd» и «def20»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...