关于一个正则式

newpbboy 2009-04-09 10:54:06
我现在需要限制数字的输入,我定义的数据库是number(5,2),也就是可以输入3位的整数和
两位的小数,但是又不一定有小数,单独输入整数不能超过3位,这个正则式怎么写啊?
...全文
336 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
原来还要这样啊 那么就:

^(([1-9][0-9]{0,2}?)((.[0-9]{0,2})?))$
newpbboy 2009-04-09
  • 打赏
  • 举报
回复
好像还是不行,输入两位整数的数值就不行了,比如23.1就不行啊,别的都可以了
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
程序员必须掌握的基本正则表达式
正则表达式是什么东东?
  正则表达式是使用一套特殊符号模式做为表达格式的字符串,主要用处是描述和解析文本。许多程序员(甚至一些不错的高手)都无视(也不用)正则表达式,我认为这是一个耻辱,因为在解决很多问题的时候,正则表达式常常让我们有得心应手的感觉。一旦你掌握了,就会发现它能解决无数真实世界的问题。   正则表达式的工作方式就象Windows或者*nix系统里面的文件名替代符 - 你可以使用特定的*或者?来指定一系列文件。但是使用正则表达式的特殊字符或者metacharacters(元字符)来表示这类事情会更准确。
  正则表达式把大多数字符当作直接字符,就好像正则表达式 mike,将只会匹配按顺序的字符序列m - i - k - e。与此同时正则表达式使用一个采用元字符的扩展集合,可以表示非常复杂的文字匹配。
  认识元字符: ^[](){}.*?\|+$ 以及在某些时候出现的 -
我知道它们看上去很恐怖,但是一旦你了解它们就会知道它们是很可爱的符号。
  行定位点: ‘^’ 和 ‘$’
‘^’ (读成:caret) 和 ‘$’ (读成:dollar) 这两个元字符分别代表一行文字的开始和结束。就象我前面举的例子,正则表达式mike会匹配字符序列m - i - k – e,可是它会匹配一行中的所有位置 (比如,它会匹配 “I’m mike”或者 “carmike”)。 ‘^’字符被用来限定匹配行的开始,因此^mike 将只会寻找以mike开始的行。同样,表达式mike$将只会寻找m - i - k - e在一行末尾的(当然还是会匹配 ‘carmike’)。
  如果我们联合使用这两个行定位点字符,我们可以搜索在多行文字中寻找包含的特殊字符串序列。比如:表达式 ^mike$ 将只会匹配占有单独一行的单词mike,一个字不多一个字不少。同样,表达式 ^$ 对于发现空行(一行开始就是本行结束的那种)很有用。
  字符分类: ‘[]’
  一对方括号被称为一个字符分类, 你可以用来匹配任何一个或多个字符。假设你想匹配单词 ‘gray’,同时也想找一下被拼写成 ‘grey’的单词。 使用一个字符分类将允许你匹配这两者 -- 正则表达式 gr[ea]y 被解读成 “匹配这样的字符串 - 一个g, 跟着是r, 跟着或者是一个e或者是一个a, 跟着一个y”。
  如果你用 [^ ... ] 代替 [ ... ], 这个分类将匹配后面列出来字符以外的任何字符。首字符 ^ 表示“否定"列表 - 不同于你列出所有希望包含的字符,你是去列出所有不想包含的字符。 注意在这里使用的^ (caret) 字符,它在字符分类方式之外使用表示另外的意思 - 用来匹配文字行的开始(见文章前面部分)。
  字符分类中的元字符: ‘-’
  在一个字符分类中,字符分类中的元字符 ‘-’ (dash) 用来指出一个字符范围。考虑字符分类 [01234567890abcdefABCDEF],采用’-’的话我们可以这样写[0-9a-fA-F],方便了不少吧。有一点大家要注意的,这个’-’符号只有用一个字符分类中才被认为是元字符,在其他位置,它只是简单的匹配普通的’-’字符,没有任何其他意义。
  但是且慢,我看到有人举手质疑。假如在一个字符分类里面,’-’字符做为第一个字符出现的时候,会把它认为成什么呢?比如[-A-F],问题很好,注意:这是一个例外,如果在字符分类中,’-’字符是第一个出现的字符,那我们把它当作普通字符而不是元字符处理(因为实际上它不可能表示一个字符范围,范围需要有开始和结束字符),这个时候它只会匹配一个普通的’-’字符。引申开来,我们再说一个例外:S’?’和’.’在大多数情况下都是正则表达式的元字符,但是有个例外是在字符分类中,当它们在字符分类中的时候(比如在:[-0-9.?],它们只是代表一个普通字符,唯一的特殊字符(元字符)是0和9中间的’-’)。
  用一个句点: ‘.’匹配任何字符
  ‘.’ 元字符(一般读成a dot 或者point)是一种匹配任何字符的写法。在你想在一个字符串的指定位置匹配一个任意字符的时候,它显得非常可爱。再强调一遍,在字符分类中,’.’就不是一个元字符了。到现在为止,你开始看出一些门道来了吧?哪些是元字符哪些不是元字符在字符分类里面和外面是不一样的。
  选择性元字符: ‘|’
  ‘|’ 元字符(读成pipe)的意思是“or”。它允许你把多个表达式合成到一个表达式,然后匹配里面任何单个表达式的结果。这些子表达式被称为备选项。
  例如:Mike 和 Michael 是两个独立的正则表达式,但是Mike|Michael 这样来写的话,这个正则表达式匹配任意一个单词。
  圆括号在这里可以被用来限制备选的范围。我们可以使用圆括号来达到和上面这个正则表达式同样的目的,同时缩短它长度,正则表达式Mi(ke|chael) 同样匹配Mike或者Michael。当然,在实际程序中我还是会用第一种写法,虽然长了一点,可是更容易理解,因此也更容易维护。
  匹配可选项: ‘?’
  ‘?’ 元字符(读成:question mark)意味着可选。它放在正则表达式的某个位置的一个字符后面,这个字符允许在匹配结果中出现,也可以不出现。当然,我们可以肯定的是:这个’?’字符只能跟在一个普通字符而不是元字符后面。
  如果我想匹配英式或者美式拼法的单词‘flavor’ ,我会用正则表达式flavou?r,它被解读成:“匹配一个字符串:f,跟着一个l,跟着一个a,跟着一个v,跟着一个o,跟着一个可选的u,跟着一个r”。
  数量符号: ‘+’ and ‘*’
  象’?’字符一样,‘+’ (读成plus)和‘*’(读成star)元字符影响前导字符(就是在这个符号前面的字符)可以在匹配字符串中出现的数量 (使用前面说的‘?’的话,相当于前导字符可以出现0次或一次)。元字符‘+’ 匹配前面出现的项目一次或更多次,而‘*’ 则表示匹配任何次,包括0次。
  如果我想通过在一场足球比赛中解说员说’goal’的声音次数来统计比分的话,我应该用正则表达式go+al, 它可以匹配‘goal’,也可以匹配一些激情主播的‘gooooooooooooooooal’ (但肯定不会是 ‘gal’)。
  前面的三个元字符:’?’、’+’、’*’一般又叫做计量符。因为它们影响前面项目的数量。
  数量范围: ‘{}’
  ‘{最小, 最大}’ 这个元字符序列允许你指定特定项目可以被匹配的最少和最大次数。例如go{1,5}al 可以用来限制我们上面的例子,只匹配1到5次o。同样的{0,1} 其实就等同于一个’?’元字符。
  转义字符: ‘\’
  ‘\’ 元字符(读成:backslash)被用来转换指定的元字符的含义,以便于你可以把它们当成普通字符来匹配。例如,你打算匹配字符’?’或者’\’,你就可以在它们前面加上一个’\’字符,这样它们就被转换成普通字符的含义,就好像这样写:‘\?’ or ‘\\’.
  如果在一个非元字符前面使用’\’的话,那么根据你使用正则表达式的语言不同,会有不同的含义,必须参阅相应的手册。比较普遍采用的是perl兼容的正则表达式(PCREs),你可以在这里查看the perldoc page for perl regular expressions. PCREs用得非常普遍,在PHP、 Ruby和ECMAScript/Javascript还有很多语言中都可以使用。
  用圆括号匹配: ‘()’
  大部分正则表达式工具允许你用圆括号设定一个特定的表达式子集。比如,我们可以用一个正则表达式http://([^/]+)去匹配一个URL的域名部分。下面让我们把这个正则表达式分解开,看看它是如何工作的。
  这个表达式的起始部分非常直白:它必须匹配“h - t - t - p - : - / - /”这样的字符序列。这个初始序列之后就是圆括号了,它被用来捕捉符合它们包围的子表达式的字符。在现在的例子中,子表达式是‘[^/]+’,用上面学到的知识,我们知道它实际上是匹配除了‘/’字符以外的任何字符一次到多次。对于一个像是 http://hi.baidu.com/ss_liang111/blog/的URL,‘hi.baidu.com’ 将会被这个圆括号里面的表达式所匹配。
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
那就这样吧:

^(([1-9][0-9]{0,2}?)|([1-9][0-9]{2}.[0-9]{1,2}))$
newpbboy 2009-04-09
  • 打赏
  • 举报
回复
Sunshined 你的差不多,就是还有一条就是:可以录入1位的小数
keystudio 2009-04-09
  • 打赏
  • 举报
回复

Match m = Regex.Match(str, @"^\d{1,3}(.\d{1,2})?$");
if (m.Success)
...;
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
其实不需要那么多()的,只是为了更好的理解(因为我初学 呵呵)

这:^(([1-9][0-9]{0,2}?)|([1-9][0-9]{2}.[0-9]{2}))$ 应该就没问题
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
可以输入3位的整数和两位的小数,但是又不一定有小数,单独输入整数不能超过3位

试试这个:

^(([1-9]([0-9]{0,2})?)|([1-9]([0-9]{2}).([0-9]{2})))$

刚开始学习正则 不太懂...
我对LZ表达意思的理解(只允许以下情况):
1.输入1位、2位或者3位整数 如:9,99,999;
2.输入3位整数和2位小数的数 如: 999.99;
newpbboy 2009-04-09
  • 打赏
  • 举报
回复
我试过了不行啊,要不你把验证的方法也帮忙写一下啊,我再试啊
keystudio 2009-04-09
  • 打赏
  • 举报
回复

@"\d{1,3}(.\d{1,2})?"
xinyangwang_soft 2009-04-09
  • 打赏
  • 举报
回复
结贴也发。^((-)?[1-9](\d{0,2})?(\.\d{1,2})?)|0?|(0\.\d{1,2})$
newpbboy 2009-04-09
  • 打赏
  • 举报
回复
谢谢大家了,结贴给分了
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 newpbboy 的回复:]
软件给我发一个好吗?
我的邮箱:qiaorfeng@163.com
谢谢[/Quote]

这软件压缩有4M 我这里网速慢 刚刚试了下 发不出去
我已经把下载地址站内M你了
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 newpbboy 的回复:]
可是我试了他的不行啊,你的是可以的,可能是我不太会用他的吧,我是这样写的,不知道对不对啊:
function check(obj)
{
var exp="/^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$/g";
RegularExp=eval(exp); …
[/Quote]

改成:
var exp=/^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$/g;
不需要双引号... JS跟.net不一样
wackyboy 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 newpbboy 的回复:]
可是我试了他的不行啊,你的是可以的,可能是我不太会用他的吧,我是这样写的,不知道对不对啊:
function check(obj)
{
var exp="/^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$/g";
RegularExp=eval(exp); …
[/Quote]
把 exp的双引号去掉
sayoath 2009-04-09
  • 打赏
  • 举报
回复
[1-9]{1,3}\.\d[1-9]?|[1-9]{1,3}
这个不行嘛。
你要什么样的哟
newpbboy 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 Sunshined 的回复:]
引用 33 楼 newpbboy 的回复:
引用 31 楼 wackyboy 的回复:
引用 30 楼 newpbboy 的回复:
好了,25楼基本解决我的问题了,谢谢
还有就是我是写在js中的,28楼的我怎么用啊?
@"^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$")
其中的@,还有“”是做什么用的啊?


JScript code
var pattern=/^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$/g;

我试了,好像不行啊,11就不行啊


没问题啊 我这测试通过啊

推荐一个正…
[/Quote]
软件给我发一个好吗?
我的邮箱:qiaorfeng@163.com
谢谢
newpbboy 2009-04-09
  • 打赏
  • 举报
回复
可是我试了他的不行啊,你的是可以的,可能是我不太会用他的吧,我是这样写的,不知道对不对啊:
function check(obj)
{
var exp="/^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$/g";
RegularExp=eval(exp);
alert(obj.value);
if (RegularExp.test(obj.value)) { alert("对了"); }
else { alert("不对"); }
}

其中的正则式用25楼就可以,用31楼不可以啊
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 newpbboy 的回复:]
引用 31 楼 wackyboy 的回复:
引用 30 楼 newpbboy 的回复:
好了,25楼基本解决我的问题了,谢谢
还有就是我是写在js中的,28楼的我怎么用啊?
@"^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$")
其中的@,还有“”是做什么用的啊?


JScript code
var pattern=/^(?:0|[1-9]\d{0,2})(?:\.\d{1,2})?$/g;

我试了,好像不行啊,11就不行啊
[/Quote]

没问题啊 我这测试通过啊

推荐一个正则使用的软件:RegexBuddy 这也是昨天论坛上好心人推荐给我的
Sunshined 2009-04-09
  • 打赏
  • 举报
回复
wackyboy的答案已经OK了啊 我的答案比较臃肿 哈 你把分给他就行lo~
加载更多回复(25)

62,267

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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