仅当存在字母时才匹配数字的正则表达式
Regex to match numbers only if alphabets are present
我需要一个正则表达式来匹配以下方式的字符串:
#1234abc
: 应该匹配
#abc123
: 应该匹配
#123abc123
: 应该匹配
#123
: 应该不匹配
#123_
: 应该不匹配
#123abc_
: 应该匹配
这意味着只有当字符串包含数字或下划线以及字母时才应该匹配。只有 numbers/underscore 不应匹配。也不应匹配任何其他特殊字符。
这个正则表达式基本上是从字符串中获取主题标签。我已经尝试过以下方法,但对我来说效果不佳。
preg_match_all('/(?:^|\s)#([a-zA-Z0-9_]+$)/', $text, $matches);
请提出建议。
做:
^(?=.*[A-Za-z])[\w_]+$
[\w_]+
匹配一个或多个字母、数字、_
零宽度正先行模式 (?=.*[A-Za-z])
确保匹配至少包含一个字母
您可以使用这个正则表达式:
((.*?(\d+)[a-zA-Z]+.*)|(.*[a-zA-Z]+(\d+).*)).
在此处访问:http://regexr.com/3ef6q
看到它工作:
如果您需要按照您在较大字符串中指定的格式匹配主题标签,请使用
(?<!\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)
负先行会导致部分匹配失败在#
之后都是digits/underscores,而(?=\w*[a-zA-Z])
正向前瞻要求在0+个单词字符之后至少应该有1个ASCII字母。
我需要一个正则表达式来匹配以下方式的字符串:
#1234abc
: 应该匹配#abc123
: 应该匹配#123abc123
: 应该匹配#123
: 应该不匹配#123_
: 应该不匹配#123abc_
: 应该匹配
这意味着只有当字符串包含数字或下划线以及字母时才应该匹配。只有 numbers/underscore 不应匹配。也不应匹配任何其他特殊字符。
这个正则表达式基本上是从字符串中获取主题标签。我已经尝试过以下方法,但对我来说效果不佳。
preg_match_all('/(?:^|\s)#([a-zA-Z0-9_]+$)/', $text, $matches);
请提出建议。
做:
^(?=.*[A-Za-z])[\w_]+$
[\w_]+
匹配一个或多个字母、数字、_
零宽度正先行模式
(?=.*[A-Za-z])
确保匹配至少包含一个字母
您可以使用这个正则表达式:
((.*?(\d+)[a-zA-Z]+.*)|(.*[a-zA-Z]+(\d+).*)).
在此处访问:http://regexr.com/3ef6q
看到它工作:
如果您需要按照您在较大字符串中指定的格式匹配主题标签,请使用
(?<!\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)
负先行会导致部分匹配失败在#
之后都是digits/underscores,而(?=\w*[a-zA-Z])
正向前瞻要求在0+个单词字符之后至少应该有1个ASCII字母。