Scala教程(九)正则表达式

来源:互联网 发布:听喊麦用什么软件好 编辑:程序博客网 时间:2024/05/20 10:11

  


Scala教程()正则表达式

 


1 正则表达式

1.1 什么是正则表达式


  在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

  正则表达式规定的一个特殊代码叫作它元字符(metacharacter)

 

常用的元字符 

代码

说明

.

匹配除换行符以外的任意字符

\w

匹配字母或数字或下划线或汉字

\s

匹配任意的空白符

\d

匹配数字

\b

匹配单词的开始或结束

^

匹配字符串的开始

$

匹配字符串的结束

 

1.2 字符转义

  如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.\*。当然,要查找\本身,你也得用\\.例如:deerchao\.net匹配deerchao.netC:\\Windows匹配C:\Windows

 

常用的限定符 

代码/语法

说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n

{n,}

重复n次或更多次

{n,m}

重复nm

 

1.3 分组

  分组:用小括号来指定子表达式。

   (\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配13位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})

IP地址中每个数字都不能大于255.

  不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

 

1.4 反义

  有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:

 

常用的反义代码

代码/语法

说明

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配不是单词开头或结束的位置

[^x]

匹配除了x以外的任意字符

[^aeiou]

匹配除了aeiou这几个字母以外的任意字符

 

1.5 贪婪与懒惰

  当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

 

懒惰限定符

代码/语法

说明

*?

重复任意次,但尽可能少重复

+?

重复1次或更多次,但尽可能少重复

??

重复0次或1次,但尽可能少重复

{n,m}?

重复nm次,但尽可能少重复

{n,}?

重复n次以上,但尽可能少重复

 

1.6 网上的资源及本文参考文献


 精通正则表达式(第3版)

 微软的正则表达式教程

 System.Text.RegularExpressions.Regex(MSDN)

 专业的正则表达式教学网站(英文)

 关于.Net下的平衡组的详细讨论(英文)

 

2 Scala中的正则表达式


2.1 声明正则表达式变量

    // 定义正则表达式:匹配符合数字和小字字母    val regex = """([0-9+] (a-z)+)""".r;

2.2 正则表达式匹配数字

    val numPattern = "[0-9]+".r        // findAllIn方法找到line中所有符合正则的字符串,可以通过toArray方法来将匹配到的结果存放到Array中。for循环中,遍历出符合条件的匹配。    for(matchString <-numPattern.findAllIn("99345 Scala 22298 Spark")){        println(matchString);    }; 


  输出结果:99345

             22298

2.3 正则表达式匹配赋值

    // findFirstIn只匹配第一个符合正则的字符串就停止了:    val numberPattern = """\s+[0-9]+\s""".r    println(numberPattern.findFirstIn("99ss java 22 hadoop storm")) 

  输出结果:Some( 22 )


2.4 case多级匹配

    //  case中使用正则匹配    val line = "3999ss spark"    line match {        case numitemPattern(num,blog) => println("num="+num+",blog="+blog)         case _=> println("no case...")    }
 

 输出结果:no case...

 

 

    --以上为Scala正则表达式的内容,谢谢大家对我的关注。

                                                                                                                                                                                      ——厚积薄发(yuanxw)



1 0