Мне нужно сопоставить пробел, но ограничить совпавшее с некоторым условием ..
Источник : Код AS-277 Красный / Желтый Код AS 278 Красный: Код AS 279; Код AS-280 красный; Код AS 279 / ОБНОВИТЬ : Необходимый результат: 1. сопоставить все слова [\ w] и несколько специальных символов [_- + *] для кода 2. Стоп-символ - это [/;)] и ЦВЕТ КОНСТАНА [СИНИЙ | ЖЕЛТЫЙ | И Т.Д.] 3. без учета регистра AS-277 AS 278 AS 279 AS-280
Я пишу на regex101.com
https://regex101.com/r/S6mvZF/2
Кажется, вы можете использовать
'~Code\s+([\w+*]+(?:[-\s][\w+*]+)*?\b)\s?(?:red|blue|green|yellow|[);/])~i'
Увидеть regex demo
подробности
Code
— подстрока\s+
— 1 или более пробелов[\w+*]+
— 1 или более букв, цифр, _
, *
или же +
(?:[-\s][\w+*]+)*?
— ноль или более (но как можно меньше) последовательностей:
[-\s]
— а -
или пробел[\w+*]+
— 1 или более букв, цифр, _
, *
или же +
\b
— граница слова (т. е. должен быть не-слово char (не буква, не цифра и не_
) \s?
— 1 или 0 пробелов(?:red|blue|green|yellow|[);/])
— одна из альтернатив: red
, blue
, green
, yellow
(добавить больше после |
), или же [);/]
— а )
, ;
или же /
,Возьмите значение группы 1 после матча.
Вы могли бы сделать:
$string = preg_replace('/^.*Code (AS[- ]\d+).*$/m', '$1', $string);
Демо-версия: https://regex101.com/r/S6mvZF/4
или же
preg_match_all('/Code (AS[- ]\d+)/, $string, $matches);
а потом $matches[1]
будет иметь все ваши спички.
Оба регулярных выражения ищут Code AS
, затем дефис или пробел, а затем хотя бы одно число (если десятичные знаки ограничены, можно применить диапазон {1,3}
). Первое регулярное выражение идет строка за строкой. Второй только захватывает каждый матч.
Демо-версия: https://regex101.com/r/S6mvZF/5
Получив нужный результат, попробуйте это:
AS[- ][0-9]{3}
Я думаю, что это должно сработать:
Code (AS[ -]\d{3})
Это
Вот демо: https://regex101.com/r/S6mvZF/3
Удачи!