求一个简单的正则表达式,请高人指教!!!!

digisdio 2005-11-28 10:21:25
一个由逗号分割的数字(1、23、2),也可以是一个数字范围(12-34,22-55),里面不允许有除了数字、逗号和减号之外的其他字符。

有一些基本的校验不知道能不能写到表达式里,比如连续2个以上的逗号“,,,,,”,或者减号“-----”等等。


例子:
1,3,4,7-10,20-30

这个表达式是用来校验用户输入的page number是否合法的。

多谢~~~~
...全文
245 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
这个不在标题范围内了,呵呵

你自己想吧,逗号时substring -> text
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
又好好想了一遍

^((\d+-\d+)|\d+)(,((\d+-\d+)|\d+))*$

可以对分布不均的进行匹配
1,2-9,12,45-98,1,16,18,78-108,456-789,23
1,2,3
1
3-9,1-8
3-9,1-8,2,6,3-9,1-8
3-9

你的问题是遇到(逗号 或 确认按钮)才可以应用正则匹配
digisdio 2005-11-28
  • 打赏
  • 举报
回复
我想再详细说一下我的用法:
我做了一个TextField,实现的时候监听KeyEvent,只要输入了字符,我就用正则表达式校验,如果校验失败就不添加这个字符。
所以还会出现这种情况,当前textfield中的内容是“5”,此时用户按下“,”即逗号,用这个表达式无法使“5,”这个字串校验通过。
请问有方法解决么?
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
建议楼主

1.用正则分割,把逗号隔开的字符串放到ArrayList

2.只要其中的每一项都能匹配 一个页面 或 页面范围,就可以认为合法

这样还比较简单点
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
能写通用的吗,这样怎么匹配

1,2-9,12,45-98,1,16,18,78-108,456-789,981
nighthawk 2005-11-28
  • 打赏
  • 举报
回复
借贴一问:如果类似5-7,56,78-89,410-456。其中"-"的分布没有规则.将如何匹配?
^(\\d+|(\\d+ *- *\\;d+))(,(\\d+|(\\d+ *- *\\d+)))*$
无法匹配这种情况。
digisdio 2005-11-28
  • 打赏
  • 举报
回复
to rcom10002(KNIGHTRCOM):
是的,可能我有点钻牛角尖了,像去掉空白字串这种预处理是不需要让正则表达式去做的。
另外,请问“^((\d+,)*\d+(,\d+-\d+)*|(\d,)*(\d+-\d+,)*(\d+-\d+))$”和之前的“^((\d+,)*\d+(,\d+-\d+)*)$”有什么区别?
hcom 2005-11-28
  • 打赏
  • 举报
回复
up
digisdio 2005-11-28
  • 打赏
  • 举报
回复
to believefym(暮色,miss,迷失,miss。。。) :
多谢,您的这个更全面一些,可以匹配“number,range,number”类型的字串。
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
空格的处理你用java,处理成无空格的字符串再传进来

还有你要保证传进来的顺序是,单页+范围页(1,5,56,78-89,410-456)

^((\d+,)*\d+(,\d+-\d+)*|(\d,)*(\d+-\d+,)*(\d+-\d+))$
believefym 2005-11-28
  • 打赏
  • 举报
回复
rcom10002(KNIGHTRCOM)的正则式无法匹配"1-2,3"这种格式,楼主的需求都是有-的都在最后的吗?
没有"1-2,3,2-3,4"这种?
只有"1,2,3,4,5-6,6-7"这种?
Pattern p = Pattern.compile("^(\\d+|(\\d+ *- *\\;d+))(,(\\d+|(\\d+ *- *\\d+)))*$");
Matcher m = p.matcher("1,2,3-4,3");
while(m.find()){
System.out.println(m.group());
}

believefym 2005-11-28
  • 打赏
  • 举报
回复
Pattern regex = Pattern.compile("^((\\d+,)*\\d+(,\\d+ *- *\\d+)*)$",
Pattern.CANON_EQ);
digisdio 2005-11-28
  • 打赏
  • 举报
回复
to rcom10002(KNIGHTRCOM):
多谢,这个成了,那么再进一步,如果是这样的字串“1, 3-4, 5 - 6”,就是之间有空白字符的话,如何改进这个表达式才能匹配?请赐教。
believefym 2005-11-28
  • 打赏
  • 举报
回复
Pattern p = Pattern.compile("^(\\d+|(\\d+-\\;d+))(,(\\d+|(\\d+-\\d+)))*$");
Matcher m = p.matcher("1,2,3-4,3");
while(m.find()){
System.out.println(m.group());
}
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
Boolean FoundMatch = false;
try {
Pattern regex = Pattern.compile("^((\\d+,)*\\d+(,\\d+-\\d+)*)$",
Pattern.CANON_EQ);
Matcher regexMatcher = regex.matcher(subjectString);
FoundMatch = regexMatcher.find();
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
这个没问题了,不好意思 ^((\d+,)*\d+(,\d+-\d+)*)$
digisdio 2005-11-28
  • 打赏
  • 举报
回复
是不是没加对逗号的匹配?
digisdio 2005-11-28
  • 打赏
  • 举报
回复
to rcom10002(KNIGHTRCOM):
我对正则表达式一窍不通,我用下面的代码调试:

public class TestRegEx
{
public static void main(String[] args)
{
Matcher m = Pattern.compile("^(\\d+)|(\\d+-\\d+)$").matcher("1,2,3,8-9");
System.out.println(m.matches());
}
}

输出false
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
这个 ^(\d+)|(\d+-\d+)$
rcom10002 2005-11-28
  • 打赏
  • 举报
回复
^(\d+)(\d+-\d+)$

缺陷,范围判断时无法保障前一个数比后一个小

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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