js正则表达式问题~~高分求~~谢谢~

tinerli 2011-10-08 05:40:35
之前帖子不能编辑了,我重新重新写下需求:

命名必需以非'-'和'_'开头,以字母、数字和'-'和'_'组成,末尾不能是'_'或者'_'加数字并且不能以纯数字命名。

比如我输入‘-test’,'_test',‘test_’,‘test_123’,'123'都是不合法的
输入‘test’,'test_test123','test-test123'是合法的

...全文
195 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
打油的程序员 2011-10-09
  • 打赏
  • 举报
回复


//上面的java代码,其实是由三个部分合并而成,请看下面的做法
import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class TestRegex {
public static void main(String[] args) {
String[] sourceStrings = {
"-test","_test","test_","test_123","test-","test-123","123"//这是你给出的错误例子
,"test","test_test123","test-test123"//这是你给出的正确例子
,"1test2","te1st","1test2","test2"//不存在-_时,至少有一个字母
,"1te-st2A","te-1stA","1te-st2A","te-st2A"//存在-_时(不能在两头),且结尾是字母时
,"1te-st2","te-1st2","1te-st2","te-st2"//存在-_时(不能在两头),且结尾是数字时
};//不存在-_时,至少有一个字母

String regex = "^[a-zA-Z\\d]+[a-zA-Z][a-zA-Z\\d]*$";//不存在-_时,至少有一个字母
regex += "|^[a-zA-Z\\d]+[a-zA-Z\\d-_]*[a-zA-Z]$";//存在-_时(不能在两头),且结尾是字母时
regex += "|^[a-zA-Z\\d]+[a-zA-Z\\d-_]*[-_][a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*[\\d]$";//存在-_时(不能在两头),且结尾是数字时

//以字母、数字和'-'和'_'组成,
//命名必需以非'-'和'_'开头,
//末尾不能是'_'或者'_'加数字,末尾不能是‘-’或者‘-’加数字,
//不能以纯数字命名。

Pattern pattern = Pattern.compile(regex);

for(int i=0; i<sourceStrings.length; i++){
System.out.println("----------------------------------");
System.out.println(sourceStrings[i] + " 匹配吗? " );
System.out.println(pattern.matcher(sourceStrings[i]).find());
}
}
}
/*
----------------------------------
-test 匹配吗?
false
----------------------------------
_test 匹配吗?
false
----------------------------------
test_ 匹配吗?
false
----------------------------------
test_123 匹配吗?
false
----------------------------------
test- 匹配吗?
false
----------------------------------
test-123 匹配吗?
false
----------------------------------
123 匹配吗?
false
----------------------------------
test 匹配吗?
true
----------------------------------
test_test123 匹配吗?
true
----------------------------------
test-test123 匹配吗?
true
----------------------------------
1test2 匹配吗?
true
----------------------------------
te1st 匹配吗?
true
----------------------------------
1test2 匹配吗?
true
----------------------------------
test2 匹配吗?
true
----------------------------------
1te-st2A 匹配吗?
true
----------------------------------
te-1stA 匹配吗?
true
----------------------------------
1te-st2A 匹配吗?
true
----------------------------------
te-st2A 匹配吗?
true
----------------------------------
1te-st2 匹配吗?
true
----------------------------------
te-1st2 匹配吗?
true
----------------------------------
1te-st2 匹配吗?
true
----------------------------------
te-st2 匹配吗?
true
*/



打油的程序员 2011-10-09
  • 打赏
  • 举报
回复
这是详细的java代码,如果你发现哪个匹配不对 很可能是我理解题意错误,你楼下指出bug,再进行修正


import java.util.regex.Pattern;

public class TestRegex {
public static void main(String[] args) {
String[] sourceStrings = {
"-test","_test","test_","test_123","test-","test-123","123"//这是你给出的错误例子
,"test","test_test123","test-test123"//这是你给出的正确例子
,"1test2","te1st","1test2","test2"//不存在-_时,至少有一个字母
,"1te-st2A","te-1stA","1te-st2A","te-st2A"//存在-_时(不能在两头),且结尾是字母时
,"1te-st2","te-1st2","1te-st2","te-st2"//存在-_时(不能在两头),且结尾是数字时
};//不存在-_时,至少有一个字母


String regex = "^[a-zA-Z\\d]+([a-zA-Z][a-zA-Z\\d]|[a-zA-Z\\d-_]*([a-zA-Z]|[-_][a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*[\\d]))$";
//以字母、数字和'-'和'_'组成,
//命名必需以非'-'和'_'开头,
//末尾不能是'_'或者'_'加数字,末尾不能是‘-’或者‘-’加数字,
//不能以纯数字命名。

Pattern pattern = Pattern.compile(regex);

for(int i=0; i<sourceStrings.length; i++){
System.out.println("----------------------------------");
System.out.println(sourceStrings[i] + " 匹配吗? " );
System.out.println(pattern.matcher(sourceStrings[i]).find());
}
}
}
/*output:
----------------------------------
-test 匹配吗?
false
----------------------------------
_test 匹配吗?
false
----------------------------------
test_ 匹配吗?
false
----------------------------------
test_123 匹配吗?
false
----------------------------------
test- 匹配吗?
false
----------------------------------
test-123 匹配吗?
false
----------------------------------
123 匹配吗?
false
----------------------------------
test 匹配吗?
true
----------------------------------
test_test123 匹配吗?
true
----------------------------------
test-test123 匹配吗?
true
----------------------------------
1test2 匹配吗?
true
----------------------------------
te1st 匹配吗?
true
----------------------------------
1test2 匹配吗?
true
----------------------------------
test2 匹配吗?
true
----------------------------------
1te-st2A 匹配吗?
true
----------------------------------
te-1stA 匹配吗?
true
----------------------------------
1te-st2A 匹配吗?
true
----------------------------------
te-st2A 匹配吗?
true
----------------------------------
1te-st2 匹配吗?
true
----------------------------------
te-1st2 匹配吗?
true
----------------------------------
1te-st2 匹配吗?
true
----------------------------------
te-st2 匹配吗?
true
*/



打油的程序员 2011-10-09
  • 打赏
  • 举报
回复
楼主重复发帖愿意送分,我也重复上代码:

我刚学javascript 语法还不懂,(好像只是\\和\有区别。楼主自行修改),下面的java代码 ,可以对付上个第10楼的例子


regex = "^[a-zA-Z\\d]+([a-zA-Z][a-zA-Z\\d]|[a-zA-Z\\d-_]*([a-zA-Z]|[-_][a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*[\\d]))$";
tinerli 2011-10-09
  • 打赏
  • 举报
回复
ls两位的表达式都可以~~非常感谢两位!
打油的程序员 2011-10-09
  • 打赏
  • 举报
回复



//不好意思合并的时候 出了点误差,把*误看做是+了
//原始是这样的
regex = "^[a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*$";//不存在-_时,至少有一个字母
regex += "|^[a-zA-Z\\d]+[a-zA-Z\\d-_]*[a-zA-Z]$";//存在-_时(不能在两头),且结尾是字母时
regex += "|^[a-zA-Z\\d]+[a-zA-Z\\d-_]*[-_][a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*[\\d]$";//存在-_时(不能在两头),且结尾是数字时

//合并后(现在的版本):
regex = "^[a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*$|^[a-zA-Z\\d]+[a-zA-Z\\d-_]*([a-zA-Z]$|[-_][a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*[\\d]$)";


jshi123 2011-10-09
  • 打赏
  • 举报
回复
应楼主要求,这种情况判为合法
[Quote=引用 20 楼 tinerli 的回复:]
你好 ,我的另外个帖子里加了(末尾不能是‘-’或者‘-’加数字)的需求,这个帖子是没有这个需求的,这个应该怎么改
[/Quote]
打油的程序员 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 jshi123 的回复:]

但是用你的正则a123不能匹配
[/Quote]

当初的是这个。不知道合并的时候 是不是给我改了
regex = "^[a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*$";//不存在-_时,至少有一个字母
regex += "|^[a-zA-Z\\d]+[a-zA-Z\\d-_]*[a-zA-Z]$";//存在-_时(不能在两头),且结尾是字母时
regex += "|^[a-zA-Z\\d]+[a-zA-Z\\d-_]*[-_][a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*[\\d]$";//存在-_时(不能在两头),且结尾是数字时

打油的程序员 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 jshi123 的回复:]

上面又错了,试试这个
^(?![0-9]+$)(?![-_])([a-zA-Z0-9-]+|_(?![_0-9]+$|$))+$
[/Quote]

这个错了
----------------------------------
test-123 匹配吗?
true

jshi123 2011-10-09
  • 打赏
  • 举报
回复
但是用你的正则a123不能匹配
打油的程序员 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 jshi123 的回复:]


谢谢啊,帮我找出错误来,当时没有仔细想,现在这个修改版你再看看。
btw,失误总是难免的,比如你的a123就不能通过
[/Quote]

按照楼主的需求 a123是符合题意的
jshi123 2011-10-09
  • 打赏
  • 举报
回复
上面又错了,试试这个
^(?![0-9]+$)(?![-_])([a-zA-Z0-9-]+|_(?![_0-9]+$|$))+$
jshi123 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 tinerli 的回复:]
……
你好 ,我的另外个帖子里加了(末尾不能是‘-’或者‘-’加数字)的需求,这个帖子是没有这个需求的,这个应该怎么改
[/Quote]
^(?![0-9]+$)([a-zA-Z0-9-]+|(?!^)_(?![_0-9]+$|$))+$

[Quote=引用 17 楼 k3108001263 的回复:]
也是错误的,比如 :


#abc 匹配吗?
true
[/Quote]
谢谢啊,帮我找出错误来,当时没有仔细想,现在这个修改版你再看看。
btw,失误总是难免的,比如你的a123就不能通过
峭沙 2011-10-09
  • 打赏
  • 举报
回复
重复发贴?送分?上面贴子不是已经解决了吗,需求有变化照猫画虎就行了。。
chinaskysun 2011-10-09
  • 打赏
  • 举报
回复
一个正则不行就多来几个
<SCRIPT Language="VBScript">
Function reg(Str)
Dim Re,Match,Matches
Set Re = New Regexp
Re.Global = True
Re.Ignorecase = True

Re.Pattern="^\b[a-zA-Z0-9][a-zA-Z0-9_\-]+[a-zA-Z0-9]\b$"
ck = re.Replace(Str,"")
If ck = "" Then
reg = "合法"
Else
reg = "不合法"
Exit Function
End If

Re.Pattern="^\b[0-9]+\b$"
ck = re.Replace(Str,"")
If ck = "" Then
reg = "不合法"
Exit Function
Else
reg = "合法"
End If

Re.Pattern="^\b.*[\_|\-][0-9]*\b$"
ck = re.Replace(Str,"")

If ck = "" Then
reg = "不合法"
Exit Function
Else
reg = "合法"
End If

End Function

arr = "-test,_test,test_,test_123,test-,test-123,123,test,test_test123,test-test123,1test2,te1st,1test2,test2,1te-st2A,te-1stA,1te-st2A,te-st2A,1te-st2,te-1st2,1te-st2,te-st2"
arr = Split(arr,",")
For i = 0 To UBound(arr)
Document.write arr(i) & "-" & reg(arr(i)) & "<br>"
next
</SCRIPT>
tinerli 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 k3108001263 的回复:]

楼主重复发帖愿意送分,我也重复上代码:

我刚学javascript 语法还不懂,(好像只是\\和\有区别。楼主自行修改),下面的java代码 ,可以对付上个第10楼的例子


regex = "^[a-zA-Z\\d]+([a-zA-Z][a-zA-Z\\d]|[a-zA-Z\\d-_]*([a-zA-Z]|[-_][a-zA-Z\\d]*[a-zA-Z][a-zA-Z\\d]*[\……
[/Quote]
你好 ,我的另外个帖子里加了(末尾不能是‘-’或者‘-’加数字)的需求,这个帖子是没有这个需求的,这个应该怎么改
tinerli 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jshi123 的回复:]

是吗,楼主的要求里没有这么说啊。如果末尾也不能是'-'或者'-'加数字,应该这样:
^(?![0-9]+$)[^-_]([a-zA-Z0-9]+|[_-](?![_0-9-]+$|$))+$
[/Quote]

你好 ,我的另外个帖子里加了(末尾不能是‘-’或者‘-’加数字)的需求,这个帖子是没有这个需求的,这个应该怎么改
tinerli 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 k3108001263 的回复:]

引用 17 楼 k3108001263 的回复:

引用 16 楼 jshi123 的回复:

是吗,楼主的要求里没有这么说啊。如果末尾也不能是'-'或者'-'加数字,应该这样:
^(?![0-9]+$)[^-_]([a-zA-Z0-9]+|[_-](?![_0-9-]+$|$))+$


也是错误的,比如 :


#abc 匹配吗?
true


Java co……
[/Quote]
继续请教下
若是把这个条件(末尾不能是‘-’或者‘-’加数字,)去掉的话,这个应该怎么改?
打油的程序员 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 k3108001263 的回复:]

引用 16 楼 jshi123 的回复:

是吗,楼主的要求里没有这么说啊。如果末尾也不能是'-'或者'-'加数字,应该这样:
^(?![0-9]+$)[^-_]([a-zA-Z0-9]+|[_-](?![_0-9-]+$|$))+$


也是错误的,比如 :


#abc 匹配吗?
true
[/Quote]


//以字母、数字和'-'和'_'组成,


所以使用 ?! ?<! 等匹配模式,是相当麻烦的,还是直接分开各种情况写,接着使用|串接的方法 轻松点
打油的程序员 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jshi123 的回复:]

是吗,楼主的要求里没有这么说啊。如果末尾也不能是'-'或者'-'加数字,应该这样:
^(?![0-9]+$)[^-_]([a-zA-Z0-9]+|[_-](?![_0-9-]+$|$))+$
[/Quote]

也是错误的,比如 :


#abc 匹配吗?
true
jshi123 2011-10-09
  • 打赏
  • 举报
回复
是吗,楼主的要求里没有这么说啊。如果末尾也不能是'-'或者'-'加数字,应该这样:
^(?![0-9]+$)[^-_]([a-zA-Z0-9]+|[_-](?![_0-9-]+$|$))+$
加载更多回复(12)

87,989

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧