2016-10-18 1 views
3

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

  • #1234abc: должны получить согласованный
  • #abc123: должны получить согласованный
  • #123abc123: Должно получиться соответствие
  • #123: Если не получить соответствие
  • #123_: Если не получить соответствие
  • #123abc_: должны получить соответствие

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

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

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

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

+0

Проверяются ли строки отдельно или вы извлекаете их из большего текста? –

+0

* Это регулярное выражение в основном для получения хэштегов из строки * - ваши образцы текстов не являются хэштегами. Если вам нужно сопоставить хэштеги в указанном вами формате, попробуйте ['(?

ответ

1

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

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

Смотрите regex demo

Детали:

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

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

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

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

+0

Есть ли способы принять хэштеги на других языках? – Allena

+0

Да, используйте '/ (?

+0

Я использую первый. И он не принимает второй символ здесь # 早上. – Allena

0

Do:

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

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

Demo

1

Вы можете использовать этот Regex:

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

Access его здесь: http://regexr.com/3ef6q

видеть, что это работает:

enter image description here

+0

Я пробовал это так, preg_match_all ('/ (?:^| \ S) # ((. *? \ d +) [a-zA-Z] +. *) | (. * [a-zA-Z] + (\ d +). *))/', $ text, $ matches); Даже простой текст не работал. Например: Моя шляпа #blue. Результат, который я должен получить, - синий. – Allena

+0

Да, вы правы. Я не видел, что вам нужно соответствовать строке, даже если у вас нет номеров. В этом случае положительный прогноз, предложенный @Wiktor Stribiżew, решит вашу проблему. –