我需要正则表达式以下列方式匹配字符串:
#1234abc
:应该匹配 #abc123
:应该匹配 #123abc123
:应该匹配 #123
:应该不匹配 #123_
:应该不匹配 #123abc_
:应该匹配 这意味着只有在字符串包含数字或下划线以及字母表时才应匹配。只有数字/下划线不匹配。任何其他特殊字符都不应该匹配。
这个正则表达式基本上是从字符串中获取主题标签。我已经尝试了以下但是对我来说效果不佳。
preg_match_all('/(?:^|\s)#([a-zA-Z0-9_]+$)/', $text, $matches);
请提出建议。
答案 0 :(得分:1)
答案 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)