求正则(只能是以字母或者字母加数字 不能纯数字 5-15个字符)

Luffy666 发布于 2013/08/13 14:51
阅读 6K+
收藏 0
请好心人帮帮忙,在线求答~!
加载中
0
purejava
purejava

这样写更好理解一些

([a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*){5,15}

0
JonyZhang
JonyZhang
/[a-z\d]+[a-z][a-z\d]+/gi

 上面这个可以验证格式,就是不能验证长度。

其实你的本意是必须要有字母存在,而且长度在5~15位,用两步来判断会比较容易点

0
kiwivip
kiwivip
写模块实现更靠谱~
0
LiShixi
LiShixi

^[a-zA-Z]\w{5,15}$
我这个匹配首字符必须为字母,用来匹配用户名的吗?

0
中山野鬼
中山野鬼

引用来自“purejava”的答案

这样写更好理解一些

([a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*){5,15}

哈。你这样写对吗?  [a-zA-Z0-9]* 匹配结束的条件是字符不能为它们中的一种,随后你又去判断字符是否为 a-zA-Z。

正好写书,在讨论如何检测非法正则表达式,两种情况,你这种写法就是其中一种。。属于永远无法完整匹配成功的写法。

0
徐迎龙
徐迎龙
\w[\w\d]{4,14}
0
m
mononite

不知道你用的什么语言,如果正则表达式支持lookahead功能,那写起来很简单,下面的代码在Javascript里应该可以工作:

/(?!\d+$)[\dA-Za-z]{5,15}/.test(s)

0
purejava
purejava

引用来自“中山野鬼”的答案

引用来自“purejava”的答案

这样写更好理解一些

([a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*){5,15}

哈。你这样写对吗?  [a-zA-Z0-9]* 匹配结束的条件是字符不能为它们中的一种,随后你又去判断字符是否为 a-zA-Z。

正好写书,在讨论如何检测非法正则表达式,两种情况,你这种写法就是其中一种。。属于永远无法完整匹配成功的写法。

看你一说回去又试了一下,匹配没问题,但长度限制理解错了,那是把整个括号里的内容重复5-15次了,看来长度要另外判断?


Pattern pattern = Pattern.compile("([a-zA-Z0-9]*)([a-zA-Z])([a-zA-Z0-9]*)");
String[] strs = { "abcd8", "a8888", "8abcd", "8888a", "88a88", "ab8cd", "abcde", "88888" };
for (String str : strs) {
    Matcher matcher = pattern.matcher(str);
    if (matcher.find()) {
        System.out.println(str + " : " + matcher.group(1) + " " + matcher.group(2) + " " + matcher.group(3));
    } else {
        System.out.println(str + " : No match");
    }
}

abcd8 : abc d 8
a8888 :  a 8888
8abcd : 8abc d 
8888a : 8888 a 
88a88 : 88 a 88
ab8cd : ab8c d 
abcde : abcd e 
88888 : No match

正则表达式应该是匹配最大可能字符串的

0
中山野鬼
中山野鬼

引用来自“purejava”的答案

引用来自“中山野鬼”的答案

引用来自“purejava”的答案

这样写更好理解一些

([a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*){5,15}

哈。你这样写对吗?  [a-zA-Z0-9]* 匹配结束的条件是字符不能为它们中的一种,随后你又去判断字符是否为 a-zA-Z。

正好写书,在讨论如何检测非法正则表达式,两种情况,你这种写法就是其中一种。。属于永远无法完整匹配成功的写法。

看你一说回去又试了一下,匹配没问题,但长度限制理解错了,那是把整个括号里的内容重复5-15次了,看来长度要另外判断?


Pattern pattern = Pattern.compile("([a-zA-Z0-9]*)([a-zA-Z])([a-zA-Z0-9]*)");
String[] strs = { "abcd8", "a8888", "8abcd", "8888a", "88a88", "ab8cd", "abcde", "88888" };
for (String str : strs) {
    Matcher matcher = pattern.matcher(str);
    if (matcher.find()) {
        System.out.println(str + " : " + matcher.group(1) + " " + matcher.group(2) + " " + matcher.group(3));
    } else {
        System.out.println(str + " : No match");
    }
}

abcd8 : abc d 8
a8888 :  a 8888
8abcd : 8abc d 
8888a : 8888 a 
88a88 : 88 a 88
ab8cd : ab8c d 
abcde : abcd e 
88888 : No match

正则表达式应该是匹配最大可能字符串的

匹配当然没有问题,但这么写除非正则表达式的解析会自动帮你调整,不然你有多少符合第一项的字符,就全部在第一项匹配掉了。后面不会参与匹配的。
0
purejava
purejava

引用来自“中山野鬼”的答案

引用来自“purejava”的答案

引用来自“中山野鬼”的答案

引用来自“purejava”的答案

这样写更好理解一些

([a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*){5,15}

哈。你这样写对吗?  [a-zA-Z0-9]* 匹配结束的条件是字符不能为它们中的一种,随后你又去判断字符是否为 a-zA-Z。

正好写书,在讨论如何检测非法正则表达式,两种情况,你这种写法就是其中一种。。属于永远无法完整匹配成功的写法。

看你一说回去又试了一下,匹配没问题,但长度限制理解错了,那是把整个括号里的内容重复5-15次了,看来长度要另外判断?


Pattern pattern = Pattern.compile("([a-zA-Z0-9]*)([a-zA-Z])([a-zA-Z0-9]*)");
String[] strs = { "abcd8", "a8888", "8abcd", "8888a", "88a88", "ab8cd", "abcde", "88888" };
for (String str : strs) {
    Matcher matcher = pattern.matcher(str);
    if (matcher.find()) {
        System.out.println(str + " : " + matcher.group(1) + " " + matcher.group(2) + " " + matcher.group(3));
    } else {
        System.out.println(str + " : No match");
    }
}

abcd8 : abc d 8
a8888 :  a 8888
8abcd : 8abc d 
8888a : 8888 a 
88a88 : 88 a 88
ab8cd : ab8c d 
abcde : abcd e 
88888 : No match

正则表达式应该是匹配最大可能字符串的

匹配当然没有问题,但这么写除非正则表达式的解析会自动帮你调整,不然你有多少符合第一项的字符,就全部在第一项匹配掉了。后面不会参与匹配的。

正则匹配肯定会优先选择成功的匹配路径,而不是找到一条不成功的匹配就告诉你匹配失败,否则像这样的sql语句

select * from person where name like '%小%'
永远也不会返回任何结果了。

上面的匹配规则,[a-zA-Z]是确定的,可以匹配"abcd8"中abcd任一字符,但[a-zA-Z0-9]*是贪心匹配,会匹配"abc"这一最长结果而把d留下。

如果规则改成([a-zA-Z0-9]*?)([a-zA-Z])([a-zA-Z0-9]*)非贪心匹配,结果就变成"" "a" "bcd8"。

返回顶部
顶部