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

Regex to match numbers only if alphabets are present

我需要一个正则表达式来匹配以下方式的字符串:

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

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

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

请提出建议。

做:

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

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

Demo

您可以使用这个正则表达式:

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

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

看到它工作:

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

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

regex demo

详情:

  • (?<!\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) 负先行会导致部分匹配失败在#之后都是digits/underscores,而(?=\w*[a-zA-Z])正向前瞻要求在0+个单词字符之后至少应该有1个ASCII字母。