正则表达式之实例

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>


小结




以上是关于正则表达式之实例的主要内容,如果未能解决你的问题,请参考以下文章

jmeter之正则表达式写法实例推荐

Shell脚本正则表达式之——grepegrepsed(内含多个Demo)

正则表达式之原理篇

看完就懂系列之正则表达式(值得收藏)

shell脚本之正则表达式

MySQL数据库高阶语句之正则表达式运算符