Каким будет регулярное выражение для разбиения следующей строки в php? - PullRequest
0 голосов
/ 28 мая 2018

string

T1 - X1(1), 7
T2 - C2(-9), -15
T3 - Y2(1), 3
T5 - C2(-1), 100

regexp, используемый для preg_split

/[-,#\n#()]/

В приведенном выше регулярном выражении рассматривается дефиспробел такой же, как и минус перед числом.

Требуется окончательный результат * Массив 1016 *, имеющий после preg_split и подрезать пробел ["T1", "X1", "1", "7" "Т2", "С2", "- 9", "- 15", "Т3", "У2", "1", "3", "Т5", "С2", "- 1","100 "]

Какие изменения необходимо внести в регулярное выражение для достижения требуемого конечного результата?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы можете сопоставить либо символ пробела, дефис и пробел s-\s символ или | совпадение символов, которые вы хотите исключить [(),\s], используя класс символов:

\s-\s|[(),\s]

$data = <<<DATA
T1 - X1(1), 7
T2 - C2(-9), -15
T3 - Y2(1), 3
T5 - C2(-1), 100
DATA;

$result = preg_split("~\s-\s|[(),\s]~", $data, -1, PREG_SPLIT_NO_EMPTY);

print_r($result);

Демо

0 голосов
/ 28 мая 2018

Вы должны пропустить отрицательные числа.Это можно сделать с помощью глаголов PCRE:

-\d(*SKIP)(*FAIL)|\s*[-,#\n#()]\s*

Пример PHP:

$string = 'T1 - X1(1), 7
T2 - C2(-9), -15
T3 - Y2(1), 3
T5 - C2(-1), 100';
print_r(preg_split('/-\d(*SKIP)(*FAIL)|\s*[-,#\n#()]\s*/', $string, -1, PREG_SPLIT_NO_EMPTY));
  1. https://3v4l.org/m51qS
  2. https://regex101.com/r/659ocz/1/
...