Как извлечь слова, которые имеют как буквенные, так и числовые символы? - PullRequest
1 голос
/ 08 апреля 2019

Я хочу извлечь слова, которые имеют как алфавитные, так и числовые символы / например, функция возвращает ac64fc в тексте ниже: foo ac64fc bar 4544

 preg_match('/^[0-9A-Z]*([0-9][A-Z]|[A-Z][0-9])[0-9A-Z]*$/', $subject);

Я написал это регулярное выражение, чтобы найти, есть лино я не знаю, как я могу извлечь слово (ac64fc)

Ответы [ 3 ]

3 голосов
/ 08 апреля 2019

Вы заставляете входную строку быть только в заданном формате якорями ^ и $. Замените их на \b (маркер границы слова) , и все готово (также не забудьте включить флаг i, который делает его нечувствительным к регистру).

Также для упрощения вы можете использовать следующую версию, которая явно не вызывает обходных путей:

\b(?:[a-z]+\d|\d+[a-z])[a-z\d]*\b

Смотрите живую демонстрацию здесь

PHP код:

preg_match('/\b(?:[a-z]+\d|\d+[a-z])[a-z\d]*\b/i', $subject);
1 голос
/ 08 апреля 2019

Попробуйте Regex: (?=\w*\d)(?=\w*[a-zA-Z])[A-Za-z\d]+

Демо

1 голос
/ 08 апреля 2019

В вашей строке нет прописных символов, но вы можете использовать границу слова \b и положительный прогноз (?=, чтобы утверждать цифру, и при сопоставлении убедитесь, что совпадает хотя бы один символ a-zA-Z.

(или наоборот, в поисках символа a-z и совпадения хотя бы с 1 цифрой)

\b(?=[A-Za-z0-9]*[0-9])[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*\b

regex demo

Используя флаг без учета регистра, ваш код может выглядеть следующим образом:

$subject = "foo ac64fc bar 4544";
preg_match('/\b(?=[A-Za-z0-9]*[0-9])[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*\b/i', $subject, $matches);
print_r($matches[0]); // ac64fc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...