正则表达式 - 用户指南

正则表达式是用于描述由美国数学家Stephen Kleene 发明定义的编码搜索方法的术语

本页描述的语法(语言格式)符合IEEE POSIX 1003.2(第2.8节)中定义的扩展正则表达式(ERE)。ERE现在通常由Apache,PERL,PHP4,Javascript 1.3 +,MS Visual Studio,大多数可视编辑器,vi,emac,GNU系列工具(包括grep,awk和sed)以及许多其他工具支持。扩展正则表达式(ERE)将支持基本正则表达式(BRE本质上是ERE的子集)。实现RE的大多数应用程序,实用程序和语言,特别是PERL,扩展了ERE功能,通常称为PERL兼容正则表达式(PCRE)在很大程度上已成为事实上的标准。如果涉及一些奇怪的正则表达式变体,应始终参考实施文档。

翻译:该网页已被翻译成匈牙利语索尔特博罗什 -许多感谢。

内容

 

温和的介绍: - 基础知识
简单搜索
括号,范围和否定 [], - 和^ 
搜索定位(又名锚点) ^和$ 
迭代(又名量词)?,*,+,{n},{nm}和{n ,} 
括号和交替()和| 
POSIX标准字符类:
常用扩展: - \ w等
Subexpressions,Submatches,Groups和Backreferences:
Regular Expression Tester: - 在浏览器中试验您自己的目标字符串和搜索表达式
一些示例: - 一个有效的示例和一些示例
注意: - 使用实用程序和语言时的一般注意事项
实用工具说明: - 使用Visual Studio正则表达式
实用工具注意事项: - 使用sed进行文件操作(不适合胆小的人)

温和的介绍:基础知识

标题具有欺骗性。正则表达式没有温和的开端。你要么进入象形文字的大时代 - 在这种情况下你会喜欢这些东西 - 或者你需要使用正则表达式,在这种情况下你唯一的奖励可能是头痛。但它们非常有用。有时。

我们开始之前的一些定义

我们将在本概述中使用术语文字元字符目标字符串, 转义序列搜索表达式(也称为正则表达式)。以下是我们术语的定义:

文字 一个文字是我们在搜索或匹配的表达式中使用任何字符,例如,发现IND以W IND OWS的IND是一个文字字符串-每个字符的搜索扮演一个角色,这是从字面上我们要查找的字符串。
元字符 元字符是具有独特的意义,并不用于作为一个或多个特殊字符的文字中搜索表达式,例如,字符^(抑扬或脱字符号)是一个元字符
目标字符串 该术语描述了我们将要搜索的字符串,即我们想要在其中找到匹配或搜索模式的字符串。
搜索表达式 最常见的是正则表达式。该术语描述了我们将用于搜索目标字符串的搜索表达式,即我们用于查找所需内容的模式。
逃脱序列 一个转义序列是表明我们要使用我们的一个方式的元字符作为文本在正则表达式的转义序列包括把元字符 \(反斜杠)在前面的元字符,我们希望作为使用文字,例如,如果我们想找到(多个)在目标串窗口(S)然后,我们使用搜索表达式\(s \),如果我们想在目标字符串c:\\文件中找到\\文件那么我们需要使用搜索表达式\\\\ file(每个\我们想要搜索一个文字(有2个)前面有一个转义序列 \)。

在本指南中,我们将使用以下内容作为目标字符串:

STRING1    Mozilla / 4.0(兼容; MSIE 5.0; Windows NT; DigExt)
 STRING2    Mozilla / 4.75 [en](X11; U; Linux2.2.16-22 i586)

这些是浏览器ID字符串,显示为Apache环境变量HTTP_USER_AGENT(Apache环境变量的完整列表)。

简单匹配

我们将尝试对我们的示例目标字符串进行一些简单的匹配:

注意:您也可以在完成示例时进行实验

搜索
(搜索表达式)
     
STRING1 比赛 找到m m in co m patible
  STRING2 不配 此字符串中没有小写字母m除非您采取特殊措施,否则搜索区分大小写。
一个/ 4 STRING1 比赛 在Mozill中找到a / 4 .0 - 任何字符组合都可用于匹配
  STRING2 比赛 与STRING1在同一个地方找到
5 \ [ STRING1 不配 搜索正在寻找'5 ['的模式,这在STRING1中不存在。空格在搜索中有效。
  STRING2 比赛 发现于Mozilla / 4.7 5 [ en]
      注意: \(反斜杠)是一个转义字符,必须存在,因为以下[是我们将在下一节中讨论的元字符。
STRING1 比赛 在W 找到 dows
  STRING2 比赛  Ux 找到
STRING1 比赛 在compatib发现
  STRING2 不配 此字符串中有l和e,但它们不相邻(或连续)。

检查我们的正则表达式测试程序中的结果

<grovel>在本指南的先前版本中,我们错误地省略了表达式'5 \ ['中的\。这正确地在RE测试器中给出了语法错误 - 尽管错误消息中的附加说明文本具有误导性。没有我们引入粗心的错误,这个东西很难。提供了衷心而谦卑的道歉。那些沮丧地撕裂你头发的人现在可以停下来了。</拜倒>

括号,范围和否定

括号表达式引入了我们的第一个元字符,在这种情况下,方括号允许我们定义要测试的事物列表,而不是我们到目前为止检查的单个字符。这些列表可以分组为通常包含众所周知的组的字符类,例如所有数字等。

元字符

含义

[]

将方括号内的任何内容与一个字符位置匹配,一次且仅一次。例如,[12]表示将目标与1匹配,如果不匹配则将目标与2匹配,而[0123456789]表示与0到9范围内的任何字符匹配。

-

方括号内的 - (破折号)是'范围分隔符'并允许我们定义范围,在上面的[0123456789]示例中,我们可以将其重写为[0-9]。

您可以在列表中定义多个范围,例如,[0-9A-C]表示检查0到9和A到C(但不是a到c)。

注意:要测试 - 括号内(作为文字)它必须是第一个或最后一个,也就是说,[ - 0-9]将测试 - 和0到9。

^

方括号内的^(circumflex或插入符号)否定了表达式(我们将后面的方括号外看到旋转/插入符号的替代用法),例如,[^ Ff]表示除大小写F和[^ az]之外的任何内容。 ]表示除小写a到z之外的所有内容。

笔记:

  1. 范围分隔符值之间没有空格,如果有,则根据范围,它将被添加到可能的范围或被拒绝为无效。对空间要非常小心。

  2. 一些正则表达式系统,特别是VBScript,提供了一个用于字符串的否定运算符(!)。这是一个非标准功能,因此生成的表达式不可移植。

  3. 由于插入符号(或抑扬符号)的双重性质,您将经常看到类似[^“],[^ <]或[^,]的表达式,这些表达式通常用作分隔符触发器(与迭代结合使用时),用于更复杂的搜索或解析时,比如HTML或逗号分隔的文本。

注意:大多数正则表达式软件都内置了一些特殊的范围值(字符类),如果它声明BRE或ERE符合POSIX 1003.2,则必须这样。

所以让我们用我们的目标字符串尝试这些新东西。

搜索
(搜索表达式)
     
在[杜] STRING1 比赛 认定IND以W IND OWS
  STRING2 比赛 在L inu x 找到inu
X [0-9A-Z] STRING1 不配 所有测试都区分大小写。要在DigE xt中找到xt,我们需要使用[0-9a-z]或[0-9A-Zt]。我们也可以使用这种格式来测试大小写,例如,[Ff]将检查大写和小写F.
  STRING2 比赛 在Linu x2中找到x2
[^ AM]在 STRING1 比赛 Win dows中找到胜利
  STRING2 不配 我们在搜索中排除了A到M的范围,因此找不到Linux,但会找到linux(如果存在)。

检查我们的正则表达式测试程序中的结果

定位(或锚)

我们可以控制匹配有效的目标字符串中的位置。以下是影响搜索位置的元字符列表

元字符

含义

^ 没有在方括号内使用 ^(circumflex或插入符号)(它具有不同的含义)意味着只查看目标字符串的开头,例如,^ Win将无法在STRING1中找到Windows ^ Moz将找到Moz illa 。
$ $(美元)意味着只查看目标字符串的末尾,例如,fox $将在'silver fox '中找到匹配,因为它出现在字符串的末尾但不是'狐狸跳过月亮' 。
的。(句号)指该位置的任何字符,例如ton。会发现色调TONNTONN淡而不是肆意的,因为它没有下面的字符。

注意:许多系统和实用程序(但不是全部)支持特殊定位宏,例如\ <在单词的开头匹配,\>在单词的结尾处匹配,\ b在单词的开头或结尾处匹配,\ B除了在一个词的开头或结尾。常用值列表

所以让我们用我们的示例目标字符串来尝试这个。

搜索
(搜索表达式)
     
[AZ] \)$ STRING1 比赛 在DigiEx中找到t)t) 注意: \是一个转义字符,需要将它视为文字
  STRING2 不配 我们在这个字符串的末尾有一个数值,但是我们需要[0-9a-z]来找到它。
。在 STRING1 比赛 Win dows中找到胜利
  STRING2 比赛 Lin ux 找到Lin 

检查我们的正则表达式测试程序中的结果

迭代'元字符'

以下是一组迭代元字符(也称为量词),可以控制在搜索中找到前一个字符的次数迭代元字符也可以与括号元字符结合使用

元字符

含义

的?(问号)匹配前一个字符仅发生0或1次,例如,colou?r将找到颜色(u找到0次)和颜色(u找到1次)。
* *(星号或星号)匹配前一个字符出现0次或更多次,例如,tre *将找到树(e找到2次)和胎面(e找到1次)和低谷(e找到0次因此仅在tr上返回匹配
+ 当前面的字符出现1次或更多次时,+(加号)匹配,例如,tre +将找到树(e被发现2次)和胎面(e被发现1次)但不是低谷(0次)。
{N} 当前面的字符或字符范围出现n次时匹配,例如,找到我们可以使用的[0-9] {3} - [0-9] {4}的本地电话号码,它可以找到任意数量的表格123-4567。值括在大括号(大括号)中。

注意:在这种情况下 - (破折号),因为它在方括号之外,是一个文字Louise Rains写道,开始使用NXX代码(NXX代码是上例中的123-4567 123部分)是零无效(在上面的表达式中允许)。在这种情况下,表达[1-9] [0-9] {2} - [0-9] {4}对于查找有效的本地电话号码是必要的。

{N,M} 当前面的角色出现至少n次但不超过m次时匹配,例如ba {2,3} b将找到baabbaaab但不是babbaaaab值括在大括号(大括号)中。
{N,} 当前面的角色出现至少n次时匹配,例如,ba {2,} b将找到'baab','baaab'或'baaaab'但不是'bab'。值括在大括号(大括号)中。

注意:虽然对某些人来说可能是显而易见的,但也值得强调哪些角色在迭代中起作用。在上述所有示例中,只有迭代字符或表达式前面的字符才会参与迭代,搜索表达式(正则表达式)中的所有其他字符都是文字因此,在第一个示例搜索表达式colou?r中,字符串colo是文字,必须在触发迭代序列(u?之前找到,如果满足,则必须后跟文字r以便匹配发生。

所以让我们用我们的示例目标字符串来尝试它们。

搜索
(搜索表达式)
     
\(。* L STRING1 比赛 发现(和在升 compatib 即开口\是用于指示一个转义字符(它之前是一个文字(检索文字)不是元字符。

注意:如果你使用带有STRING1测试器和上面的表达式,它将返回匹配(compatiblebl。文字(基本上是锚定搜索 - 它只是说只有当找到时才开始搜索。以下。*表示(可能)跟随任意字符,零次或多次(*)(因此()compatib并终止于找到的检索-他们不是搜索的一部分是碰巧出现在这个字符串基本上是随机的字符)只包含文字。的是真正的搜索表达式的一部分。

  STRING2 不配 Mozilla包含lls,但前面没有开括号(不匹配),Linux有大写L(不匹配)。

我们之前使用搜索值l定义了上述测试(感谢David Werner Wiebe指出我们的错误)。搜索表达式l?实际上意味着找到任何东西,即使它没有l(l 0或1次),所以在两个字符串上都匹配。我们一直在寻找一种方法来找到单个l并排除ll,这种方法没有超前(PERL开创的正则表达式的相对较新的扩展)非常困难。嗯,这是我们的借口。

赢得 STRING1 比赛 Win dows中找到胜利
  STRING2 比赛  u 的L 查找 W为零的时间 - 所以匹配。
[XX] [0-9A-Z] {2} STRING1 不配 在DigExt中找到x但只有一个t。
  STRING2 比赛 在X11中找到X和11。

检查正则表达式测试程序中的结果

更多'元字符'

以下是一组额外的元字符,为我们的搜索提供了额外的功能:

元字符

含义

() ((左括号)和)(右括号)可用于将我们的搜索表达式的部分组合(或绑定)在一起。正式地,这称为子表达式(也称为子匹配或子组),子表达式可以嵌套到任何深度。括号(子表达式)还将匹配的元素捕获到可用作反向引用的变量中。请参阅此示例,了解其在绑定中的用法更多关于子表达式(也称为分组或子匹配)及其作为反向引用的用法
| (垂直条或管道)在techspeak中被称为交替,并且意味着找到左手或右边的值,例如,gr(a | e)y将找到“灰色”或“灰色”并且感觉到 - 找到了文字characters'gr' - 如果第一个测试无效(a)第二个测试将被尝试(e),如果第一个测试有效则不会尝试第二个测试。交替可以嵌套在每个表达式中,因此gr((a | e)| i)y将找到'gray','gray'和'griy'。

所以让我们用我们的示例字符串来尝试这些。

搜索
(搜索表达式)
     
^([LZ]中) STRING1 不配 '^'是一个锚(因为它位于任何方括号之外),表示第一个位置。Win不会启动字符串所以不匹配。
  STRING2 不配 '^'是一个锚(因为它位于任何方括号之外),表示第一个位置。 Lin ux没有启动字符串所以没有匹配。
((4 \ [0-3])|。。(2 \ [0-3])) STRING1 比赛 发现4.0在Mozilla / 4.0'\。' sequence使用escape metacharacter(\)来确保'。' (点)用作搜索中的文字。
  STRING2 比赛 发现2.2在Linux的2.2 .16-22。
(W | L)在 STRING1 比赛 Win dows中找到胜利
  STRING2 比赛 Lin ux 找到Lin

<humblepie>在本页的一个明显版本中,我们吹掉了表达式^([LZ] in)。我们错误地说,这会否定测试[LZ],'^'只方括号执行此功能,这里它在方括号之外,是一个指示'从第一个字符开始' 非常感谢Mirko Stojanovic指出并向所有人道歉。</ humblepie>

检查正则表达式测试程序中的结果

更多东西

内容

  1. POSIX标准字符类
  2. Apache浏览器识别 - 一个有效的例子
  3. 常用扩展 - \ w等
  4. 子匹配,组和反向引用
  5. 正则表达式测试程序 - 在浏览器中试验您自己的字符串和表达式
  6. 常见示例 - 正则表达式示例
  7. 注释 - 使用实用程序和语言时的一般注意事项
  8. 实用工具说明 - 使用Visual Studio正则表达式
  9. 实用工具说明 - 使用sed进行文件操作(不适合胆小的人)

有关正则表达式的更多信息,请转到Languages / regex下链接页面有很多人真正的嗡嗡声,让任何搜索成为“一个班轮”,他们非常有助于告诉你他们是如何做到的。欢迎来到精彩的,如果神秘的正规表达世界。您可能希望使用此工具来使用新发现的知识

去内容

POSIX字符类定义

POSIX 1003.2第2.8.3.2节(6)定义了一组表示某些公共范围的字符类。它们往往看起来非常丑陋但具有同样考虑到“区域设置”的优点,即本地语言/编码系统的任何变体许多公用事业/语言提供速记调用这些类的方法。严格地说,使用的名称及其内容引用了LC_CTYPE POSIX定义(1003.2第2.5.2.1节)。

含义

[:alnum:] 任何字母数字字符0到9或A到Z或a到z(由上,下和数字定义的集合)
[:α:] 任何字母A到Z或a到z(由上部和下部定义的集合)。
[:ASCII:] (十六进制)中的任何字符都在x00到x7F之间。
[:空白:] 空格,仅限TAB字符。
[:CNTRL:] 控制字符NL CR LF TAB VT FF NUL SOH STX EXT EOT ENQ ACK SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC IS1 IS2 IS3 IS4 DEL。
[:数字:] 只有数字0到9
[:图形:] 任何可打印字符(由alnum和punct定义的集合)但不包括单个字符SPACE。
[:降低:] 任何字母a至z。
[:PUNCT:] 标点符号。,“'?!;:#$%&()* + - / <> = @ [] \ ^ _ {} |〜
[:打印:] 任何可打印的字符(由alnum和punct定义的集合)加上单个字符SPACE。
[:空间:] 任何空格字符(空格,制表符,NL,FF,VT,CR)。许多系统缩写为\ s。
[:字:] 任何单词字符([a-zA-Z0-9_])。许多系统缩写为\ w。
[:上:] 任何字母A至Z.
[:xdigit:] 十六进制表示法0-9,AF,af [0-9A-Fa-f]。

它们总是在[[:alnum:]]形式的方括号内使用,或者组合为[[:digit:] ad]

去内容

常用扩展名和缩略语

一些语言和大多数语言提供扩展或缩写来简化(!)正则表达式。这些往往属于字符类或位置扩展,最常见的如下所列。通常,这些扩展由PERL定义,称为PCRE(Perl兼容正则表达式),它已经以已移植到许多系统的库的形式实现。PCRE的全部细节PERL 5正则表达式文档(PERL 6 在某种程度上改变了它的正则表达式规则,但是这些规则还没有(或许还有)进入PCRE库。)

虽然\ x类型语法(正式名称为反斜杠序列)可能看起来令人困惑,但反斜杠前面的字符通常不需要转义,因此可以通过实用程序或语言正确解释 - 而我们简单的人类往往变得更容易混淆。以下PCRE支持:.NET,PHP,PERL,RUBY,PYTHON,Javascript以及许多其他PCRE。

反斜杠序列
\ d 匹配0 - 9范围内的任何字符(相当于POSIX [:digit:])
\ d 匹配任何不在0 - 9范围内的字符(相当于POSIX [^ [:digit:]])
\ S 匹配任何空白字符(空格,制表符等)。(相当于POSIX [:space:] EXCEPT VT无法识别)
\ S 匹配任何字符不是空格(空格,制表符)。(相当于POSIX [^ [:space:]])。
\ W 匹配范围0 - 9,A - Z,a - z和下划线(_)[0-9A-Za-z_]中的任何字符。相当于POSIX [:word:])
\ W 匹配任何不是范围0 - 9,A - Z,a - z和标点符号(相当于POSIX [^ [:graph:]])的字符
位置缩写
\ b 字边界。匹配单词的开头(\ bxx)和/或结尾(xx \ b)中的任何字符,因此\ bton \ b将找到ton而不是ton,但是\ bton会找到吨。
\乙 不是字边界。匹配任何字符不在一个单词的开头(\ Bxx)和/或结尾(xx \ B),因此\ Bton \ B将找到肆意但不是吨,但是吨\ B将找到肆意和吨。

注意: POSIX和PCRE使用的字符集claasifications之间存在一些(次要)差异,如果有疑问则使用更长(和更丑)的POSIX字符类定义。

去内容

Subexpressions,Submatches,Groups and Backreferences

声称BRE(或更高)的兼容性的所有正则表达式实现提供括在括号中的每个单独的比赛的最后结果(正式称为子表达式,但其经常被称为子匹配或组)中的变量,其可以随后(正则表达式已被执行之后)通过使用反向引用在表达式中使用或替换在任何正则表达式中可能存在一个或多个这样的分组。这些变量通常编号为1到9美元。其中$ 1将包含第一个子匹配,$ 2将包含第二个子匹配,依此类推。$ x值通常会持续到遇到另一个正则表达式。例子:

#assume target =“cat”
搜索表达式=(c | a)(t | z)
$ 1将包含“a”
#找到'c'但下一个字符失败(t | z)
#搜索按一个字符前进
#找不到'c'但是'a'是和 
#next字符在(t | z)中找到't' - 匹配  
#如果目标字符串是“act”
#$ 1将包含“c”
在这两种情况下,$ 2将包含“t” 

#OpenLDAP'访问'指令示例:假设目标为dn 
#是“ou = something,cn =我的名字,dc = example,dc = com”
#然后在下面的比赛结束时$ 1 ='我的名字'
#因为第一个正则表达式不使用()
访问dn.regex =“ou = [^,] +,cn =([^,] +),dc = example,dc = com”
#after expression包含反向引用
 通过dn.exact,expand =“cn = $ 1,dc = example,dc = com”

#但是,在以下指令中
访问dn.regex =“ou =([^,] +),cn =([^,] +),dc = example,dc = com”
#after expression包含反向引用
 通过dn.exact,expand =“cn = $ 2,dc = example,dc = com”
#$ 1将包含'某事'和 
#$ 2将包含“我的名字”,因为
#两个正则表达式use()

在单个表达式中使用时,这些子匹配(子表达式)通常称为组,并放置在使用形式\ 1到\ 9 反向引用寻址的数字变量中这些组或反向引用(变量)可以在正则表达式中替换。以下示例演示了用法:

#以下表达式查找任何出现的双字符
(。)\ 1
#括号创建分组(或子匹配或子表达式) 
#在这种情况下它是第一个(仅),因此由\ 1反向引用
#the。(点)找到任何字符和\ 1 backrefence替代任何东西
#字符是在下一个字符位置的点找到的, 
#因此匹配它必须找到两个相同的连续字符

通过在左括号后面立即添加字符串'?:',可以抑制任何子表达式或组(括在括号中)的捕获到后向引用中。(以下示例说明了此行为:

#在两种情况下都假定目标为dn 
#是“ou = something,cn =我的名字,dc = example,dc = com”

#所有组捕获到反向引用变量
访问dn.regex =“ou =([^,] +),cn =([^,] +),dc = example,dc = com”
#after expression包含反向引用
 通过dn.exact,expand =“cn = $ 2,dc = example,dc = com”
#$ 1将包含'某事'和 
#$ 2将包含“我的名字”,因为
#两个正则表达式use()

#抑制第一组捕获到反向引用变量
访问dn.regex =“ou =(?:[^,] +),cn =([^,] +),dc = example,dc = com”
#after expression包含反向引用
 通过dn.exact,expand =“cn = $ 1,dc = example,dc = com”
#$ 1将包含“我的名字” 

去内容

正则表达式 - 实验和测试

这个简单的正则表达式测试程序允许您使用浏览器的正则表达式Javascript函数进行实验(在浏览器中使用View Source获取Javascript源代码)。

在标签为RE的框中输入或复制/粘贴您要搜索的字符串:在标有RE:的框中输入正则表达式,单击“ 搜索”按钮,结果将显示在标有结果:的框中如果你非常幸运(或可认证的天才),结果甚至可能是你所期望的。测试人员在结果字段中显示整个搜索的字符串,并在<>中包含第一个找到的结果。如果您正在处理HTML,这可能不是非常有用 - 但我们的心脏在正确的位置。然后单独显示所有匹配项,显示找到的文本及其在字符串中的字符位置。检查案例不敏感:box使搜索大小写不敏感因此[AZ]将在“cat”中找到“a”,而不检查框[aZ]将需要在“cat”中找到“a”。注意:并非所有正则表达式系统都提供不区分大小写的功能,因此正则表达式可能无法移植。

检查结果将显示已标记的原始字符串并仅显示找到的结果,撤消所有有用的工作,但这可以使事情变得更加混乱,尤其是在处理HTML字符串或其他具有多个<>符号的情况时。Clear删除所有字段 - 包括您刚开发6小时的正则表达式。小心使用。有关限制,支持和功能,请参阅下面的说明。

笔记:

  1. 如果正则表达式无效或语法错误,测试人员将在“ 结果”字段中显示您的浏览器对您的尝试的看法 - 有时甚至可能有用。

  2. 结果字段现在显示(假设你的语法是有效的)任何反向引用变量的值(范围从$第1 - $ 9)。可以通过在后续表达式中使用变量$ 1到$ 9或在同一正则表达式中使用\ 1到\ 9来访问这些反向引用。如果不存在(正则表达式中没有子表达式或组),那么,令人惊讶的是,不会显示任何子表达式或组。

  3. 反向引用:按照遇到的顺序显示正则表达式中的所有组,以及它们是否触发终止。因此,如果使用多级嵌套,如在字符串“cat”中使用正则表达式((c | a)|(a | t))那么显示3个反向引用$ 1 = c(外括号是第一个遇到并将始终包含嵌套组中的一个匹配字符串),$ 2 = c(这是导致表达式终止的(c | a)组)和$ 3 =未定义(覆盖(a | t)组是没有触发终止表达式)。

<ouch>我们遇到了一个错误,如果匹配发生在第一个位置,那么封闭的<>就会被错误地显示出来。</哎哟>

如果您打算尝试使用用于说明各种元字符用法的目标字符串,我们会在下面仔细地复制它们以节省您所有的滚动。只需复制并粘贴到String框中即可。

STRING1    Mozilla / 4.0(兼容; MSIE 5.0; Windows NT; DigExt)
 STRING2    Mozilla / 4.75 [en](X11; U; Linux2.2.16-22 i586)
串:  
回覆:
选项: 不区分大小写:  仅结果:
     
结果:  

笔记:

  1. Javascript实现可能因浏览器而异。此功能已经过MSIE 6.x,Gecko(Firefox 2.something)和Opera 9测试(电子邮件表明它可以在Google的Chrome中运行 - 因此可能适用于任何基于WebKit的浏览器,显然包括Safari(现在甚至是Opera!) )。如果测试人员不适合你,我们非常非常伤心 - 但是对你的浏览器供应商而不是我们大喊大叫。

  2. ECMA-262(Javascript 1.2')规范定义了基于Perl 5的正则表达式实现,这意味着除标准BRE和ERE功能外,还应支持子匹配/反向引用和简短形式,如\ d。

  3. 在Opera和MSIE中,以下反向引用/子匹配工作:

    (。)\ 1
    

    其中发现任何双重字符的出现,例如勺子中的oo。使用Gecko(Firefox 2.something)它不起作用。至少从Gecko / 20100228(甚至可能在此之前)开始,表达式现在可以使用了。

  4. 正则表达式测试程序终止于找到的第一个匹配项,并通过将其包含在<>中来标记其在搜索字符串中的位置,显示整个匹配字符串以及它开始的字符位置以及适用于该点的任何后向引用。然后,测试人员遍历字符串的其余部分以查找更多匹配项,并仅显示匹配字符串以及标题附加匹配项下匹配字符串的第一个字符的字符位置每次迭代都从紧跟任何匹配字符串的最后一个字符之后的字符开始。找不到重叠的匹配项。

  5. 如果在结果字段中收到消息Match(es)= zero length,则表示您的浏览器的Javascript引擎在执行正则表达式时已被阻塞。它返回了一个有效的匹配(字符串中可能有其他匹配)但是(错误地)为匹配中的字符数返回了0的长度。当使用元字符时,在字符串中搜索单个字符时,似乎会发生这种情况(Moz / FF和IE测试)?和*。例如,正则表达式e?在任何字符串上都会生成错误(此表达式将在字符串中的每个字符上产生匹配,并且可能不是用户想要的)。

  6. 对于那些熟悉Javascript正则表达式的人来说,不需要添加封闭的//,只需输入原始正则表达式即可。那些不熟悉Javascript正则表达式的人 - 忽略前面的句子。

去内容

一些例子

以下部分显示了许多可能有助于澄清正则表达式的实例。他们很可能不会。

Apache浏览器识别 - 一个工作示例

我们曾经想用正则表达式做的就是找到足够的访问浏览器到达我们的Apache支持的网站,以决定我们的弹出菜单提供或不提供的HTML / CSS。如果表达式与USER_AGENT字符串匹配,Apache BrowserMatch指令将设置变量。

我们想知道:

  • 如果我们有任何支持Javascript的浏览器。设置isJS变量。
  • 如果我们有任何只支持的浏览器支持现在古老的MSIE DHTML对象模型。设置isIE变量。
  • 如果我们有任何支持W3C DOM的浏览器。设置isW3C变量。
  • 如果设备被分类为具有小屏幕(关键字移动(Android世界)或iphone(Apple世界))。设置isMob变量。

在他们的荣耀中,我们使用了Apache正则表达式语句(也许你现在可以理解它们,'我们不能)

BrowserMatchNoCase [mm] ozilla / [4-6] isJS
BrowserMatchNoCase MSIE isIE
BrowserMatchNoCase [Gg] ecko是W3C
BrowserMatchNoCase MSIE。((5 \。[5-9])|([6-9] | 1 [0-9]))是W3C
BrowserMatchNoCase(W3C_ | [Vv] alidator)是W3C
BrowserMatchNoCase(iphone | [mM] obile)isMob

笔记:

  • 第1行检查Mozilla / 4-6的任何大小写变体(MSIE也设置此值)。此测试为所有版本4-6浏览器设置变量isJS(我们假设版本3及更低版本不支持Javascript或至少不支持合理的Javascript)。

    注意:模糊地了解Apache功能或可以阅读的读者可能会猜测BrowserMatchNoCase的功能与它所说的相同。检查大小写变体是多余的。但是,它确实说明了区分大小写操作中的正则表达式用法。

  • 第2行仅检查MSIE(即使设置了此变量,第1行也将取消任何MSIE 1-3浏览器。

  • 第3行检查Gecko浏览器的任何大写或小写变体,包括Firefox,Netscape 6,7和现在8以及Moz克隆(所有这些都是Mozilla / 5)。

     

  • 第4行检查MSIE 5.5(或更高)或MSIE 6 - 19(未来验证 - 尽管MS正在更新MSIE,它可能会在下个月过时)。
    关于绑定的说明:此表达式不起作用:

    BrowserMatchNoCase MSIE。(5 \。[5-9])|([6-9])是W3C
    

    如果字符串中出现数字6 - 9,它会错误地设置变量isW3C。我们的猜测是第一个括号直接与MSIE表达式的结合,OR和第二个括号被视为一个单独的表达式。添加内括号可以解决问题。

  • 第5行检查该行的任何部分中的W3C_或Validator。这允许我们识别W3C验证服务(CSS或HTML / XHTML页面验证)。

  • 第6行检查线路的任何部分中的iphone或移动设备,如果存在,则设置我们用于提供视口定义的isMob变量(由于谷歌移动测试仪的破坏性质)并在较小的屏幕上禁止右手菜单。

上面的一些检查可能有点过分,例如,Mozilla曾经拼写过mozilla吗?但是由于这种“易于预防”的情况导致代码失败也很愚蠢。显然没有最终的共识,即所有Gecko浏览器都必须在他们的“用户代理”字符串中使用Gecko,但如果不这样做会非常愚蠢,因为这会迫使像我们这样的人对品牌产品进行大量测试。更可能的结果是我们不会。

去内容

常见例子

以下示例可能有用,它们特别旨在提取参数,但也涵盖其他一些基础。如果有人想给我们发送更多的例子,我们很乐意为他们添加适当的信用额度。

#分裂在简单的空间上 
字符串“aaa bbb ccc”
re = \ S + 
result =“aaa”,“bbb”,“ccc”
#注意:如果你想要空格(空格)的位置使用\ s +

#css定义拆分空格或逗号,但保留“”封闭的项目
string ='10pt“Times Roman”,Helvetica,Arial,sans-serif'
re = \ s *(“[^”] +“| [^,] +)
result =“10pt”,“\”Times Roman \“”,“Helvetica”,“Arial”,“sans-serif”

#extract HTML <>随附的标签
string ='<a href="#">链接</a>'
re = <[^>] *>
result ='<a href="#">',“</a>”

#找到所有双字符
string ='aabcdde'
re =(。)\ 1
result =“aa”,“dd”

#将逗号分隔的值分隔成组(子匹配或反向引用)
string = ou = people,cn = web,dc = example,dc = com
re = ou = [^,] +,cn =([^,] +),dc = example,dc = com
结果$ 1变量将包含“web” - 第一个表达式没有分组()
但是,使用
re = ou =([^,] +),cn =([^,] +),dc = example,dc = com
$ 1将包含“people”,$ 2将包含“web”

去内容

实用程序和语言笔记 - 一般

  1. 某些实用程序,尤其是grep,表明将任何复杂的搜索表达式括在单引号中是个好主意。事实上,这不是一个好主意 - 这绝对是必不可少的!例:

    grep'string \\'* .txt#这个工作正常
    grep string \\ * .txt#这不起作用
    
  2. 某些实用程序和大多数语言使用/(正斜杠)来开始和结束(取消限制或包含)其他可能使用单引号的搜索表达式。当可能存在可选的以下参数时尤其如此(请参阅上面的grep示例)。这些字符在搜索本身中不起任何作用。

去内容

实用工具注意事项 - 使用Visual Studio

由于自身最熟悉的原因,MS Visual Studio(VS.NET)使用了一组奇怪的正则表达式扩展。MS VS标准文档)但是如果你想恢复理智那么有一个免费的正则表达式加载项

去内容

实用工具 - 使用sed

流编辑器(sed)是用于操作文件的极其强大的工具之一,当你尝试使用它们时,这些工具非常可怕 - 除非你从古埃及的象形文字中得到一个嗡嗡声。但值得努力。因此,如果您像我们一样受到象形文字的挑战,这些笔记可能有所帮助。他们可能不会。关于sed以及sed one liners的列表,还有一系列有用的教程

  1. 并非所有的seds都是平等的: Linux使用GNU sed,BSD使用自己的,略有不同的版本。

  2. sed on windows: GNU sed已移植到windows

  3. sed是面向行的: sed在文件或输入流中的文本行上运行。

  4. 表达式引用:为了避免shell扩展(特别是在BASH中)引用单引号中的所有表达式,如“搜索表达式”中所示。

  5. sed默认为BRE:sed的默认行为是支持Basic Regular Expressions(BRE)。要使用此页面上描述的所有功能,请将-r(Linux)或-E(BSD)标志设置为使用扩展正则表达式(ERE),如下所示:

    #在Linux上使用ERE(GNU sed)
    sed -r'搜索表达式'文件
    #在BSD上使用ERE
    sed -E'搜索表达式'文件
    
  6. 原位编辑:默认情况下,sed输出为“Standard Out”(通常是控制台/ shell)。创建修改后的文件有两个互斥的选项。将“标准输出”重定向到文件或使用-i选项进行原位编辑。以下两行说明了这些选项:

    #in-situ:将未修改的文件保存到file.bak之前
    #修改
    sed -i .bak'搜索表达式'文件
    
    #redirection:文件是UNCHANGED,修改后的文件是file.bak
    sed'search expression'文件> file.bak
    
  7. sed源: Sed将从文件或“标准输入”中读取,因此可以在管道序列中使用。以下两行在功能上是等效的:

    cat file | sed'search expression'> file.mod
    sed'search expression'文件> file.mod
    
  8. sed with substitution: sed对我们大多数人的主要用途是使用替换功能更改文件的内容。Subsitution使用以下表达式:

    #替换语法
    sed'[position] s / find / change / flag'file> file.mod
    #哪里 
    #[position]  - 可选 - 在大多数文档中通常称为地址
    #s  - 表示替换命令
    #find  - 要更改的表达式
    #change  - 要替换​​的表达式
    #flag  - 控制动作,可能是
    #g =在同一行重复
    #N =仅在线发生第N次
    #p =仅在找到find时输出行!
    #(需要-n选项来抑制其他行)
    #w ofile =仅在找到时附加到ofile的行 
    # 被找到
    #if如果没有给出标志只改变第一次出现 
    每行上的#find都被替换
    
    # 例子
    #将每行上每次出现的abc更改为def
    sed's / abc / def / g'file> file.mod
    
    #将每行第二次出现的abc更改为def
    sed's / abc / def / 2'file> file.mod
    
    #create文件已更改,仅包含其中的行
    #abc已更改为def
    sed's / abc / def / w改变了'文件
    #功能与上述相同
    sed -n's / abc / def / p'文件>已更改
    
  9. 行删除: sed提供简单的行删除。以下示例说明了语法和一个简单的示例:

    #line删除语法
    sed'/ find / d'file> file.mod
    #哪里
    #find  - 找到正则表达式
    #d  - 删除命令
    
    #删除文件中的每个注释行(以#开头)
    sed'/ ^#/ d'file> file.mod
    
  10. 删除vs替换为空:如果使用sed的删除功能,它将删除出现“搜索表达式”的整行,这可能不是所需的结果。如果要做的就是从行中删除“搜索表达式”,然后使用replace with null。以下示例说明了不同之处:

    在文件中每次出现abc时,#delete(替换为null)
    sed's / abc // g'file> file.mod
    
    #删除文件中abc的每一行
    sed'/ abc / d'file> file.mod
    
  11. 转义:使用标准\技术将它们用作文字时,需要转义某些字符。这将从html页面中删除width属性,许多Web编辑器都会烦恼地放在每一行上。“在表达式中用作文字,并使用\来转义:

    #direct(substitue with null)文件中每次出现width =“x”
    #其中x可以是纯数字或百分比
    sed's / width = \“[0-9。%] * \”// g'file.html> file.mod
    
  12. 分隔符:如果你在使用sed时,比方说,路径包含/它可能是一个皇家的痛苦逃脱它们所以你可以使用任何明智的分隔符,最大限度地减少表达的视觉混淆。以下示例说明了原则:

    #使用包含/的路径的/ delimiter
    #用/ var / local / www /替换/ var / www /的所有出现次数
    sed的/ \ / var \ / www \ // \ / var \ / local \ / www \ // g'file> file.mod
    
    #功能完全相同,但不太混淆使用:作为“明智的”分隔符
    sed's:/ var / www /:/ var / local / www /:g'file> file.mod
    
  13. 使用sed: sed文档定位使用IOHO,我们称之为[position]的令人困惑的术语地址。可以选择在sed命令之前放置位置表达式,以定位后续表达式/命令的执行。命令可以采用1或2个位置表达式,这些位置表达式可以是基于行或文本的。以下是简单的例子:

    每次出现abc时,#delete(替换为null) 
    #in文件仅在以xyz开头的行上(1位置表达式)
    sed'/ ^ xyz / s / abc // g'file> file.mod
    
    每次出现abc时,#delete(替换为null) 
    #仅在第1到第50行
    #2位置表达式用逗号分隔
    sed'1,50s / abc // g'file> file.mod
    
    每次出现abc时,#delete(替换为null) 
    #除了1  -  50行 
    #2位置表达式用逗号分隔
    sed'1,50!s / abc // g'file> file.mod
    
    每次出现abc时,#delete(替换为null) 
    #包含aaa和xxx的行之间
    #2位置表达式用逗号分隔
    sed'/ aaa /,/ xxx / s / abc // g'file> file.mod
    
    #删除前50行文件
    #2位置表达式用逗号分隔
    sed'1,50d'文件> file.mod
    
    #保留前50行文件 - 删除所有其他文件
    #2位置表达式用逗号分隔
    sed'1,50!d'file> file.mod
    
  14. 何时使用-e:您可以将-e(表示sed命令)与任何搜索表达式一起使用,但是当您有多个命令序列时,必须使用-e。以下功能相同:

    #dile(替换为null)文件中每次出现width =“x”
    sed's / width = \“[0-9。%] * \”// g'file.html> file.mod
    sed -e's / width = \“[0-9。%] * \”// g'file.html> file.mod
    
  15. 剥离HTML标记:正则表达式采用最长匹配,因此剥离HTML标记时可能无法产生所需的结果:

    #target line
    <b>我</ b>希望你<i>得到</ i>迷路。
    
    #this命令在线找到第一个<和last>
    sed's /<.*>// g'file.html
    #和收益率
    丢失。
    
    #而不是分隔每个<with>
    sed's / <[^>] *> // g'file.html
    #产量
    我希望你迷路。
    
    #finally允许您必须使用的多行标签
    #following(归功于SG Ravenhall)
    sed -e:aloop -e's / <[^>] *> // g; / </ N; // bloop'
    [见下面的解释]
    
  16. 标签,分支和多个命令: sed允许在由分号(;)分隔的单行上的多个命令以及允许在命令内分支(循环)的标签定义。以下示例说明了这些功能:

    #this sequence剥离html标签,包括多行标签
    sed -e:aloop -e's / <[^>] *> // g; / </ N; // bloop'
    
    #说明:
    #e:aloop由:a创建一个标签,后跟其名称 
    #在这种情况下'loop'可以由后来的命令分支 
    #next -es / <[^>] *> // g; 删除一行上的标签和
    #the; 当前行耗尽时终止此命令。
    #此时行缓冲区(称为搜索空间)持有 
    #当前行文本应用了任何转换,因此<> 
    #行中的序列已从搜索空间中删除。
    #但是我们当前可能有<或没有<左
    #搜索空间然后由下一个命令处理:
    #/ </ N; 这是一个寻找<的定位命令
    #在搜索空间的任何剩余部分。如果<找到,则为N.  
    #在搜索空间(分隔符)中添加一个NL字符并告诉sed
    #将文件中的下一行添加到搜索空间中,进行控制 
    #然后传递给下一个命令。
    #如果<未找到,则清除搜索缓冲区(正常输出) 
    #和新行一如既往地读入搜索空间。然后控制
    #传递给下一个命令,即:
    #// bloop包含// =什么都不做,b =分支到和循环
    #这是我们将分支并创建的标签 
    #with -e:aloop。这只是简单地用EITHER重启序列
    #下一行输入(没有<留在搜索空间中)
    #或添加到搜索空间的下一行(有一个< 
    #在搜索空间中留下但没有对应的>)
    #真的非常明显!
    
  17. 将行号添加到文件中:有时能够在文件中找到行号,比如说,以匹配错误消息,例如解析器输出消息“第327行的错误”,这是非常有用的。以下内容为文件中的每一行添加一个行号后跟一个空格:

    #将行号后跟空格添加到文件中的每一行
    sed = file | sed's / \ n / /'> file.lineno
    #th first pass(s​​ed = file)创建一个行号和 
    #终止它\ n(创建一个新行)
    #第二个管道传递(sed's / \ n / /')替换空格 
    #for \ n制作单行
    

    注意:我们收到了电子邮件,询问为什么以上内容也不会删除真正的行尾(EOL)。好。当任何数据被读入缓冲区进行处理时,EOL将被删除(并且只有在写入文件时才会再次附加)。第一个命令创建的行号是预先填写的(如果写入文件,则使用EOL强制新行)到处理缓冲区,整个批次通过管道连接到第二个命令,因此是唯一找到的EOL。

  18.  

posted @ 2019-03-06 09:06  DaisyLinux  阅读(558)  评论(0编辑  收藏  举报