我正在使用这个正则表达式REGEXP '^([a-z]){2,}([0-9]){2,}$'
查找包含超过2个字母和2个以上数字的字符串以及此REGEXP '^([0-9]){2,}([a-z]){2,}$'
。
这仅涵盖以数字开头或以数字结尾的字符串。
我需要一个正则表达式来查找字母之间的数字。
MySQL version 5.1.73
答案 0 :(得分:2)
这是最长的:
^[[:alpha:]]{2,}[[:digit:]]{2,}$|^[[:alpha:]]{1,}[[:digit:]]{1,}[[:alpha:]]{1,}[[:digit:]]{1,}$|^[[:digit:]]{1,}[[:alpha:]]{1,}[[:digit:]]{1,}[[:alpha:]]{1,}$|^[[:alpha:]]{1,}[[:digit:]]{2,}[[:alpha:]]{1,}$|^[[:digit:]]{1,}[[:alpha:]]{2,}[[:digit:]]{1,}$|^[[:digit:]]{2,}[[:alpha:]]{2,}$
mysql> select * from testtable;
+-------------+
| testcol |
+-------------+
| 11aaa |
| dd12 |
| s1s2 |
| 32423sdfsfd |
| sdfs12313 |
| saf234sfs |
| asdf3sdf |
+-------------+
7 rows in set (0.00 sec)
mysql> select * from testtable where testcol regexp '^[[:alpha:]]{2,}[[:digit:]]{2,}$|^[[:alpha:]]{1,}[[:digit:]]{1,}[[:alpha:]]{1,}[[:digit:]]{1,}$|^[[:digit:]]{1,}[[:alpha:]]{1,}[[:digit:]]{1,}[[:alpha:]]{1,}$|^[[:alpha:]]{1,}[[:digit:]]{2,}[[:alpha:]]{1,}$|^[[:digit:]]{1,}[[:alpha:]]{2,}[[:digit:]]{1,}$|^[[:digit:]]{2,}[[:alpha:]]{2,}$';
+-------------+
| testcol |
+-------------+
| 11aaa |
| dd12 |
| s1s2 |
| 32423sdfsfd |
| sdfs12313 |
| saf234sfs |
+-------------+
6 rows in set (0.00 sec)
答案 1 :(得分:1)
假设您要测试列val
,请尝试以下操作:
...
WHERE (val REGEXP '^[0-9a-z]*$')
+(val REGEXP '[a-z].*[a-z]')
+(val REGEXP '[0-9].*[0-9]')=3
此组合将测试val
仅由组成的数字和字符(第一个正则表达式),包含至少两个字母' (第二个regexp)和至少两个数字(第三个正则表达式)。
答案 2 :(得分:1)
容易,但很长。使用此:
(\d.*\p{L}+.*|\p{L}.*\d+.*)(?1)+|\d{2,}\p{L}{2,}|\p{L}{2,}\d{2,}
演示: https://regex101.com/r/xT5rS6/6
\d{2,}\p{L}{2,}|\p{L}{2,}\d{2,}
:先处理确定的答案。如果它有两个或更多个数字后跟两个或更多个字母,或2个字母然后两个数字。(\d.*\p{L}+.*|\p{L}.*\d+.*)(?1)+
:它可以只是一个数字/字母,然后是另一个,然后再一个数字/字母。然后我添加.*
以忽略其他字符。 (?1)+
递归正则表达式重复第一组模式。如果它只有1位数和1个字母,则至少需要重复一次。答案 3 :(得分:0)
您可以使用零宽度正向前瞻和其他正常模式匹配:
^(?=.*[0-9]{2}).*[a-z]{2}