理论教育 Scala开发实战:正则表达式模式匹配

Scala开发实战:正则表达式模式匹配

时间:2023-11-24 理论教育 版权反馈
【摘要】:for循环中正则表达式匹配例4-18中给出的是在for循环中利用正则表达式匹配邮箱并提取邮箱名,例4-19给出的是在for循环中利用正则表达式匹配IP地址并提取各IP地址段。case语句中的正则表达式匹配例4-20演示的是正则表达式在case语句中的使用,这段代码用于模拟SparkContext处理不同的Spark运行模式时采用的正则表达式匹配。case语句中的正则表达式匹配示例。

Scala开发实战:正则表达式模式匹配

在众多的编程语言当中,包括Java、Perl、PHP、Python、JavaScript和JScript,都无一例外地支持正则表达式处理,Scala语言同样支持正则表达式,且语法格式与常用的正则表达式语法一致,虽然如Scala可以直接通过Java操作正则表达式的方式使用正则表达式,但Scala实现了自己的方式,且更为灵活,这是因为它利用了Scala模式匹配这一强大功能。

Scala常用正则表达式符号含义如表4-1所示。

表4-1 常用表达式符号使用方法

978-7-111-54169-1-Chapter04-44.jpg

978-7-111-54169-1-Chapter04-45.jpg

下面举几个实例说明其使用方式。

(1)for循环中正则表达式匹配

例4-18中给出的是在for循环中利用正则表达式匹配邮箱并提取邮箱名,例4-19给出的是在for循环中利用正则表达式匹配IP地址并提取各IP地址段。

【例4-18】匹配邮箱并提取邮箱名示例。

本例是使用模式匹配进行邮箱匹配并提取邮箱名的用法,匹配使用的也是for循环,可以看作是for循环模式匹配的一种特殊使用方式。通过val mailRegex="([\\w-]+(\\.[\\w-]+)∗)@[\\w-]+(\\.[\\w-]+)+".r创建正则表式对象,使用for(matchString<-mailRegex.findAllIn(mailStr))进行匹配,然后使用for(mailRegex(domainName, ∗)<-mailRegex.findAllIn(mailStr))提取邮箱域名

978-7-111-54169-1-Chapter04-46.jpg

代码执行结果如下:

978-7-111-54169-1-Chapter04-47.jpg

例4-18中第4行定义了一个正则表达式对象,需要注意的是mailRegex中包含3个分组匹配符,它们分别是([\\w-]+(\\.[\\w-]+)∗)、(\\.[\\w-]+)及(\\.[\\w-]+),假设有个邮箱名称为xb1988.1984@sina.com,则([\\w-]+(\\.[\\w-]+)∗)匹配xb1988.1984,第一个(\\.[\\w-]+)匹配.1984,第二个(\\.[\\w-]+)匹配.com。第7行中mailRegex.findAllIn(mailStr)返回的是MatchIterator对象,MatchIterator混入了sca⁃la.collection.Iterator特质,因此for循环可以遍历所有匹配内容。第13行代码演示了如何提取邮箱名,它调用的是Regex中的unapplySeq方法,提取的其实是匹配([\\w-]+(\\.[\\w-]+)∗)的内容。(www.daowen.com)

【例4-19】匹配IP地址并提取IP地址段示例。

本例使用正则表达式模式匹配进行IP地址匹配并提取IP地址段,使用val ipRegex="(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)".r创建模式匹配对象匹配IP地址,同样使用for循环进行操作并通过for(ipRegex(one,two,three,four)<-ipRegex.findAllIn("192.168.1. 1"))进行IP地址段的提取。

978-7-111-54169-1-Chapter04-48.jpg

代码执行结果如下:

978-7-111-54169-1-Chapter04-49.jpg

如运行结果所示,除正确匹配IP地址外,还可提取各IP地址段。例4-19第4行定义了一个正则表达式对象(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)".r,该正则表达式中包含4个分组符,都为(\\d+)这种模式,第6~10行给出了其在for循环中的匹配方式。第10~16行代码用于提取各IP地址段,这里同样调用的是Regex中的unapplySeq方法,提取的是对应分组中的内容。

(2)case语句中的正则表达式匹配

例4-20演示的是正则表达式在case语句中的使用,这段代码用于模拟SparkContext处理不同的Spark运行模式时采用的正则表达式匹配。该例中的正则表达式匹配放在cose语句中,模拟的是Spark中创建Schedule Backend的代码。

【例4-20】case语句中的正则表达式匹配示例。

978-7-111-54169-1-Chapter04-50.jpg

程序运行结果如下:

978-7-111-54169-1-Chapter04-51.jpg

例4-20第2~9行定义了4种不同的正则表达式对象,例如第3行定义的val LOCAL_N_REGEX="""local\[([0-9]+|\∗)\]""".r,它用于匹配local[N]及local[∗]两种模式,第15行中的case LOCAL_(threads)=>println("local运行模式,线程数量:"+threads)在匹配时,threads会匹配LOCAL_N_REGEX正则表达式对象([0-9]+|\∗)中的内容。代码第5行定义的val SPARK_REGEX="""spark://(.∗)""".r,它用于匹配类似于"spark://sparkmaster:7077"这样的内容,它与第19行的case SPARK_REGEX(sparkurl)=>println("spark standalone运行模式,url地址:"+sparkurl)代码是对应的。第7行val MESOS REGEX="""(mesos|zk)://.∗""".r、第9行val SIMR_REGEX="""simr://(.∗)""".r代码作用原理与第5行代码类似。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈