简介正则表达式 - regex

介绍

作为系统管理员,开发人员,QA工程师,支持工程师等,需要从文件中找到特定模式,例如属于特定范围或一系列时间戳或域或子域名组的一组IP地址。可能还需要找到以特定方式拼写的单词或在文件中找到可能的拼写错误。这是正则表达式的强大地方。 正则表达式是模板匹配模式(或有时不匹配的模式)。它们提供了一种方式来描述和解析文本。本教程将给予一个了解正则表达式,而不进入任何语言的特殊性。我们将简单地使用egrep的解释的概念。

正则表达式

正则表达式由两种类型的字符组成:
  • 常规字面字符和
  • 元字符
这些元字符是赋予正则表达式权力的元字符。 请考虑以下country.txt文件,其中第一列是国家/地区名称,第二列是国家/地区的人口,第三列是大陆。
$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

锚点元字符

的“元字符”我们将讨论第一组是 ^$。^$模式的开始和结束分别匹配和被称为 锚元字符 。 要找出国家名称以I开头的所有国家的名称,我们使用表达式:
$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe
或找出所有以大陆为结尾的国家,我们这样做:
$ egrep 'e$' country.txt
Italy,57634327,Europe
接下来的元字符是点(.),它匹配任意 一个字符 。要匹配国家/地区名称正好是5个字符长的所有行:
$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia
如果找到所有行,其中国家名称以I或J开头,国家名称为5个字符长?
$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia
[...]被称为一个 字符集字符类 。在字符集中,只有一个给定字符匹配。 字符集中的^将否定字符集。以下示例将匹配国家/地区名称五个字符长,但不以I或J开头。
$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

分组元字符和交替

匹配包含Asia或Africa的所有行:
$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia
这可以 通过采取 共同来也做。
$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

量词

不同于writing
$ egrep '^[IJ]....,' country.txt
我们可以这样
$ egrep '^[IJ].{4},' country.txt
其中 {} 被称为 量词 。它们确定它们之前的字符应该出现多少次。 我们可以给一个范围:
$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia
这将匹配以I或J开头的国家名称,后面有4到6个字符。 有一些快捷方式可用于量词。例如, {0,1} 等价于 ?
$ egrep '^ab{0,1}c$' filename
是相同的
$ egrep '^ab?c' filename
{0,}等效于 *
$ egrep '^ab{0,}c$' filename
是相同的
$ egrep '^ab*c' filename
{1,}等价于 +
$ egrep '^ab{1,}c$' filename
是相同的
$ egrep '^ab+c' filename
让我们看看一些涉及到我们迄今为止所看到的表达式的例子。这里不是从文件搜索,而是从标准输入搜索。我们使用的技巧是,我们知道 grep(或egrep)搜索一个模式,如果找到一个模式,则显示包含该模式的整行。 我们想找出所有可能的方式来拼写句子 中的 grey colour suit was his favourite 。 表达式是:
$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite
看看上面的表达式,我们可以看到:
  • grey 可以拼写为 grey 或 gray
  • colour可以写成colour或color,这意味着u是可选的,所以我们使用 u?
  • 类似的favourite或favorite可以写为favou?rite
如何匹配美国邮政编码?
$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345
在24小时时钟中匹配所有有效时间的另一个示例。
$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33
在上面的例子中,我们说,如果小时的第一个数字是0或1,那么第二个数字 可以是从0到9.但是如果第一个数字是2,则第二个数字的允许值为0,1,2或3。

词边界

要写一个模式来匹配以 color 结尾的单词,例如 unicolor,watercolor,multicolor等。 这个匹配,但不能匹配colorless或colorful。自己尝试这些例子,以熟悉他们:
$ egrep 'color\>'
接下来,要匹配colorless和colorful,但不匹配 unicolor,watercolor,multicolor 等
$ egrep '\<color'
从而匹配确切的词color,我们这样做:
$ egrep '\<color\>'

反向引用

假设我们要匹配这是双输入的所有单词 就像  the the 或 before before,我们必须使用反向引用。反向引用用于记忆模式。 例如:
$ egrep "\<the\> \1"
或通用的方式:
$ egrep "\<(.*)\> \1"
上面的例子可以用于查找所有名字,其中第一个和最后一个名字是相同的。如果有多于一组括号,则第二,第三,第四等可以用\ 2,\ 3,\ 4等引用。 这只是一个介绍正则表达式的强大简单例子。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏