仅当字母存在时才使用正则表达式来匹配数字

时间:2016-10-18 07:50:46

标签: php regex hashtag

我需要正则表达式以下列方式匹配字符串:

  • #1234abc应该匹配
  • #abc123应该匹配
  • #123abc123应该匹配
  • #123应该匹配
  • #123_应该匹配
  • #123abc_应该匹配

这意味着只有在字符串包含数字或下划线以及字母表时才应匹配。只有数字/下划线不匹配。任何其他特殊字符都不应该匹配。

这个正则表达式基本上是从字符串中获取主题标签。我已经尝试了以下但是对我来说效果不佳。

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

请提出建议。

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

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

在此处访问:http://regexr.com/3ef6q

看到它正常工作:

enter image description here

答案 1 :(得分:1)

如果您需要以较大字符串中指定的格式匹配主题标签,请使用

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

请参阅regex demo

<强>详情:

  • (?<!\S) - 在
  • 之前必须有字符串或空格的开头
  • # - 哈希符号
  • \w* - 0+单词字符(即字母,数字或下划线)
  • [a-zA-Z] - 一封信(您可以使用\p{L}代替)
  • \w* - 0+ word chars。

其他替代方案(可能看起来更快,但有点复杂):

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

这里的要点是该模式基本匹配前面带有#的1+个字符,它们位于字符串开头或空格后,但是(?![0-9_]+\b)否定前瞻会使所有匹配失败,其中部分位于{ {1}}是所有数字/下划线,#正向前瞻要求在0+字符之后应至少有1个ASCII字母。

答案 2 :(得分:0)

执行:

^(?=.*[A-Za-z])[\w_]+$
  • [\w_]+匹配一个或多个字母,数字,_

  • 零宽度正向前瞻模式(?=.*[A-Za-z])确保匹配至少包含一个字母

Demo