我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

Groovy系列之旅四(正则表达式基础)

正则表达式是字符串处理利器.简单的正则就是一些字符或数字.
包含一个最简单正则表达式的表达式是用==~.
比如说:
"beijing" ==~ /beijing/
运行一下结果是true.
在这里有两件需要注意的事情,第一是
==~它和==操作符很像,但正则匹配模式已经代替了精确比较.
第二个是/,把表达式包含在/ 里面就是告诉groovy,把它当成正则
处理,而不是字符串.

我们可以在beijing后面加上?,表达字符g是可选的.

"beijing" ==~ /beijing/
"beijin" ==~/beijing?/
结果都为true.

现在我们定义一个方法,来检验指定字符串是否符合我们给定的
正则:
def check(a,b)
{
    
if(a ==~ b)
    
{
        println(
"spell ok")
    }

    
else
    
{
        println(
"error,try again")
    }

}
鉴于刚才上面提到的基础知识,我们输入如下内容进行测试:
regular = /zdw/
check(
"zdw" , regular)
check(
"test", regular)
theRegularExpression 
= /Wisniew?ski/
check(
"Wisniewski", theRegularExpression)
check(
"Wisnieski", theRegularExpression)
check(
"Wisniewewski", theRegularExpression)

输出结果是:
spell ok
error,
try again
spell ok
spell ok
error,
try again

假定有字符串"lovebeijing" ,如果我们想让"beijing"变成可选的,比如换成"nanjing",这时
可以用(beijing | nanjing),注意|两边不能有空格:
regular = /love(beijing|nanjing)/    
check(
"lovebeijing",regular)
check(
"lovenanjing",regular)

上面两个表达式都是符合要求的.

(a | b) 只能出现其中和一个,且一次.

我们再来看看其它一些例子:
theRegularExpression = /Wis[abcd]niewski/ // 'a', 'b', 'c', 'd' 其中的一个
theRegularExpression = /Wis[abcd]?niewski/ // 'a', 'b', 'c', 'd' 其中的一个,但不是必须的
theRegularExpression = /Wis[a-zA-Z]niewski/ // 必须有一个从a-z的大写或小写字符出现
theRegularExpression = /Wis[^abcd]niewski/ // 除'a','b','c','d'以外其它字符

正则表达式符号的说明:

Regular Expression Operators
a?  matches 
0 or 1 occurrence of *a*  'a' or empty string  
a*  matches 
0 or more occurrences of *a*  empty string or 'a', 'aa', 'aaa', etc  
a+  matches 
1 or more occurrences of *a*  'a', 'aa', 'aaa', etc  
a|b  match *a* or *b*  'a' or 'b' -  
.  match any single character  'a'
, 'q', 'l', '_', '+', etc  
[woeirjsd]  match any of the named characters  'w', 'o', 'e', 'i', 'r', 'j', 's', 'd'  
[1-9]  match any of the characters in the range  '1', '2', '3', '4', '5', '6', '7', '8', '9'  
[^13579]  match any characters not named  even digits, or any other character  
(ie)  group an expression (for use with other operators)  'ie'  
^a  match an *a* at the beginning of a line  'a'  
a$  match an *a* at the end of a line  'a'  

有件事情你是必须知道的,假如你想匹配一个上面有特殊意思的符号,比如?,
你必须在?前面加'\'进行转义.

我们来看看这个例子:
check("I love beijing?",/[^\?]+\?/)
这可能是你遇到的第一个难看的正则.然而这种情况在Perl语言里面是
经常出现的.
遇到这种情况,我们可以把规则拆开开看:
/         正则开始
[^\?]   不能是?号
+         出现一次或多次
\?         匹配?
/          正则结束

这样的话,这个正则就很清楚了.
输出为: true.

posted on 2008-05-12 11:24 々上善若水々 阅读(1511) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: