Регулярное выражение для сопоставления чисел только при наличии алфавитов


Мне требуется регулярное выражение для соответствия строке следующим образом:

  • #1234abc : Должно совпадать
  • #abc123 : Должно совпадать
  • #123abc123 : Должно совпадать
  • #123 : Должно ли не совпадать
  • #123_ : Должно ли не совпадать
  • #123abc_ : Должно совпадать

Это означает, что он должен получить только соответствует, если строка содержит цифры или подчеркивание вместе с алфавитами. Только цифры/подчеркивание не должны совпадать. Любые другие специальные символы также не должны совпадать.

Это регулярное выражение в основном предназначено для получения хэштегов из строки. Я уже пробовал следующее, но это не сработало для меня хорошо.

preg_match_all('/(?:^|\s)#([a-zA-Z0-9_]+$)/', $text, $matches);

Пожалуйста, предложите что-нибудь.

Author: Wiktor Stribiżew, 2016-10-18

3 answers

Если вам нужно сопоставить хэштеги в формате, указанном в строке большего размера, используйте

(?<!\S)#\w*[a-zA-Z]\w* 

Смотрите демонстрацию регулярного выражения

Подробности:

  • (?<!\S) - должно быть начало строки или пробел перед
  • # - хэш-символ
  • \w* - 0+ символов слов (то есть букв, цифр или подчеркивания)
  • [a-zA-Z] - буква (вместо нее можно использовать \p{L})
  • \w* - 0+ символов слов.

Другое альтернативы (которые могут показаться более быстрыми, но немного более сложными):

(?<!\S)#(?![0-9_]+\b)\w+
(?<!\S)#(?=\w*[a-zA-Z])\w+

Дело в том, что шаблон в основном соответствует символам 1+ слов, которым предшествует #, который находится либо в начале строки, либо после пробела, но (?![0-9_]+\b) отрицательный внешний вид не соответствует всем совпадениям, где часть после # состоит из цифр/подчеркиваний, а положительный внешний вид (?=\w*[a-zA-Z]) требует, чтобы после символов 0+ слов было не менее 1 буквы ASCII.

 1
Author: Wiktor Stribiżew, 2016-10-18 08:10:45

Вы можете использовать это регулярное выражение:

((.*?(\d+)[a-zA-Z]+.*)|(.*[a-zA-Z]+(\d+).*)).

Доступ к нему здесь: http://regexr.com/3ef6q

Посмотрите, как это работает:

enter image description here

 1
Author: Victor Ribeiro da Silva Eloy, 2016-10-18 07:55:09

Сделайте:

^(?=.*[A-Za-z])[\w_]+$
  • [\w_]+ соответствует одной или нескольким буквам, цифрам, _

  • Шаблон с нулевой шириной, (?=.*[A-Za-z]), гарантирует, что совпадение содержит хотя бы одну букву

Демо-версия

 0
Author: heemayl, 2016-10-18 07:54:14