正则表达式之实例
Posted 21CTO
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式之实例相关的知识,希望对你有一定的参考价值。
正则表达式为开发者提供了一种处理文本和解析文本的强大工具。不论是对模式的简单搜索,还是将字符串分拆为组件。在今天,正则表达式仍是各大编程语言和操作系统使用的主流工具。
我们今天来了解如何使用正则表达式,匹配一些常见的模式。目标是教大家如何使用正则表达式,并可以理解和构建自己的模式。
在我们开始构建正则表达式之前,我们先来回顾一下基础知识。
在维基百科:https://en.wikipedia.org/wiki/Regular_expression 提供有正则表达式的历史沿革,Mozila提供了有关javascript的正则表达式开发手册:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp,Oracle也提供了在Java中使用正则表达式的模式处理:https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html。
浮点数字
现在来试着创建一个正则表达式,用它来匹配各种格式的浮点数字。在下面的输出中,当输入不匹配时,我们在第一列中会看到x标志。
现在我们就一步步构建正则表达式以匹配显示的输入。
十进制数可以很容易地匹配,这常用在表单的正则表达式匹配。
\d+
该正则表达式适用于没有小数部分或前面无符号的数字。
Regex: \d+
| 1 |2389
x | 2 |3.14
x | 3 |23.
x | 4 |45.0
x | 5 |.388
x | 6 |0.564
x | 7 |278e-8
x | 8 |399e4
分数部分
接下来我们处理小数部分。增加\.\d+,匹配小数点后面的数字
Regex:\d+\.\d+
x | 1 | 2389
| 2 | 3.14
x | 3 | 23.
| 4 | 45.0
x | 5 | .388
| 6 | 0.564
x | 7 | 278e-8
x | 8 | 399e4
要处理普通整数,我们来处理构造的部分: (\.\d+)?
Regex: \d+(\.\d+)?
| 1 |2389
| 2 |3.14
x | 3 |23.
| 4 |45.0
x | 5 |.388
| 6 |0.564
x | 7 |278e-8
x | 8 |399e4
那么怎么让小数位是可选项?毕竟,32.也是一个有效的浮点数。
Regex: \d+(\.\d*)?
| 1 |2389
| 2 |3.14
| 3 |23.
| 4 |45.0
x | 5 |.388
| 6 |0.564
x | 7 |278e-8
x | 8 |399e4
接着,我们让整数部分也可选。
regex: (\d+)?(\.\d*)?
| 1 |2389
| 2 |3.14
| 3 |23.
| 4 |45.0
| 5 |.388
| 6 |0.564
x | 7 |278e-8
x | 8 |399e4
| 9 |
但是,如果整数和小数部分都是可选的,那么正则表达式可能会匹配一个空字符串,这样不太好。所以,我们要强制要求其中有一个是必选。
Regex: (\d+(\.\d*)?|(\d+)?\.\d+)
| 1 |2389
| 2 |3.14
| 3 |23.
| 4 |45.0
| 5 |.388
| 6 |0.564
x | 7 |278e-8
x | 8 |399e4
x | 9 |
指数
看起来我们已经拿到了它。现在让我们更新正则表达式以包含指数的部分,在末尾加上(e[-+]?\d+)?,即可。
| 1 | 2389
| 2 | 3.14
| 3 | 23。
| 4 | 45.0
| 5 | .388
| 6 | 0.564
| 7 | 278e-8
| 8 | 399e4
x | 9 |
Regex: \d+
| 1 |4159892626
x | 2 |(023)8383-2245
x | 3 |1371-333-3459
x | 4 |400 330-3322
x | 5 |0417.332.4455
| 6 |18008982334
x | 7 |0101-800-238-4767
x | 8 |+13669374402
Regex: (\d{3})[-. ]?(\d{3})[-. ]?(\d{4})
| 1 |4159892626
x | 2 |(023)383-2245
| 3 |1371-333-3459
| 4 |945 330-3322
| 5 |0447.332.4455
x | 6 |18008982334
x | 7 |1-800-238-4767
x | 8 |+13669374402
如何用计算用括号括起来的区号?以下正则表达式。
Regex: \(?(\d{3})[\)-. ]?(\d{3})[-. ]?(\d{4})
| 1 |4159892626
| 2 |(823)383-2245
| 3 |377-333-3459
| 4 |945 330-3322
| 5 |447.332.4455
x | 6 |18008982334
x | 7 |1-800-238-4767
x | 8 |+13669374402
看起来我们需要更新国家/地区代码和区号之间的分隔符。
Regex: (\+?\d+)?[\(-.]?(\d{3})[\)-. ]?(\d{3})[-. ]?(\d{4})
| 1 |4159892626
| 2 |(823)383-2245
| 3 |377-333-3459
| 4 |945 330-3322
| 5 |447.332.4455
| 6 |18008982334
| 7 |1-800-238-4767
| 8 |+14669374402
| 9 |+1.800.399.3378
Regex: \w+@\w+\.\w+
| 1 |j@x.org
| 2 |abc@joe.com
x | 3 |abc@joe-blow.org
第一个问题是类似 + 和 - 是在@后有效的名称
Regex: [-\+\w]+@[-+\w]+\.[-+\w]+
| 1 |j@x.org
| 2 |abc@joe.com
| 3 |abc@joe-blow.org
接下来,域名部分至少有两个或三个句号.分隔。
Regex: [-\+\w]+@[-+\w]+\.[-+\w]+(\.[-+\w]+)?
| 1 |j@x.org
| 2 |abc@joe.com
| 3 |abc@joe-blow.org
| 4 |abc+def@joe.co.uk
还有一个问题,名称可以包含一个.号。
Regex: [-\+\.\w]+@[-+\w]+\.[-+\w]+(\.[-+\w]+)?
| 1 |j@x.org
| 2 |abc@joe.com
| 3 |abc@joe-blow.org
| 4 |abc+def@joe.co.uk
| 5 |abc.d+efg@joe.com
HTML解析
解析HTML,一般都使用编程语言的API库来完成任务。但话虽如此,在某些情况下使用正则对解析HTML会更有用。下面的代码提供一个解决方案。
包括如下功能:
1、处理不常见的网页错误,比如缺少开始或结束标签
2、只接受XML类型的标签,如<br />
3、有些字符必须正确转义,如<、>和&
我们一步步的开始增强正则表达式:
Regex: <(\w+)>[^<]*</\1>
| 1 |<p>Hello world</p>
这不接受标记中的属性。
Regex: <(\w+)[^>]*>[^<]*</\1>
| 1 |<p>Hello world</p>
| 2 |<a href="http://www.google.com">Google it!</a>
HTML标记之间内容的正则表达式不需要太严格。就目前而言,正则表达式不允许嵌套HTML等<p>Hello <b>there</b></p>。
Regex: <(\w+)[^>]*>.*</\1>
| 1 |<p>Hello world</p>
| 2 |<a href="http://www.google.com">Google it!</a>
| 3 |<p>Hello <b>world</b></p>
小结
以上是关于正则表达式之实例的主要内容,如果未能解决你的问题,请参考以下文章