`

12.正则表达式:反向引用

阅读更多

正则表达式的最重要功能之一是存储匹配的模式的一部分以供以后重新使用的能力。您可能想起,若在正则表达式模式或模式的一部分两侧加上括号,就会导致表达式的一部分被存储到临时缓冲区中。可以通过使用非捕获元字符 ?:、?= 或 ?! 来重写捕获。

 

每个捕获的子匹配项按照它们在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。可以使用 \n 来访问每个缓冲区,其中 n 是标识特定缓冲区的一位或两位十进制数字。

 

反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。以下面的句子为例:

Is is the cost of of gasoline going up up?

上面的句子很显然有多个重复的单词。如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,那该有多好。下面的正则表达式使用单个子表达式来实现这一点:

/\b([a-z]+) \1\b/gi

捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。字边界元字符确保只检测整个单词。否则,诸如“is issued”或“this is”之类的词组将不能正确地被此表达式识别。

 

正则表达式后面的全局标记 (g) 指示,将该表达式应用到输入字符串中能够查找到的尽可能多的匹配表达式的结尾处的不区分大小写 (i) 标记指定不区分大小写。 多行标记指定换行符的两边可能出现潜在的匹配。

 

使用上面的正则表达式,下面的代码可以使用子匹配项信息,将文本字符串中的两个连续相同的单词的匹配项替换为同一单词的单个匹配项:

var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim;       //Create regular expression pattern.
var rv = ss.replace(re,"$1");   //Replace two occurrences with one.

replace 方法内使用 $1 引用第一个保存的子匹配项。如果您有多个子匹配项,您将通过使用 $2$3 等依次引用它们。

反向引用还可以将通用资源指示符 (URI) 分解为其组件。假定您想将下面的 URI 分解为协议(ftp、http 等等)、域地址和页/路径:

http://msdn.microsoft.com:80/scripting/default.htm

下面的正则表达式提供该功能:

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

第一个括号子表达式捕获 Web 地址的协议部分。该子表达式匹配在冒号和两个正斜杠前面的任何单词。

第二个括号子表达式捕获地址的域地址部分。该子表达式匹配不包括 / 或 : 字符的任何字符序列。

第三个括号子表达式捕获端口号(如果指定了的话)。该子表达式匹配冒号后面的零个或多个数字。

最后,第四个括号子表达式捕获 Web 地址指定的路径和/或页信息。该子表达式匹配 # 或空格字符之外的一个或多个字符。

将正则表达式应用到上面的 URI,各子匹配项包含下面的内容:

  • RegExp.$1 包含“http”
  • RegExp.$2 包含“msdn.microsoft.com”
  • RegExp.$3 包含“:80”
  • RegExp.$4 包含“/scripting/default.htm”
分享到:
评论

相关推荐

    掌控正则表达式:第三版

    - **高级主题探索**:如反向引用、非捕获组等更复杂的正则表达式特性的使用方法。 #### 书籍特色 - **实用性强**:本书不仅仅局限于理论知识,还包含了大量的实践案例,让读者能够在实际开发中快速应用所学。 - **...

    正则表达式:深入理解与应用.zip

    1. 反向引用:在分组后,可以通过`\数字`引用前面的分组,如`\1`。 2. 多行模式:在多行文本中,`^`匹配每一行的开始,`$`匹配每一行的结束。 3. 位置匹配:`^`匹配字符串开始,`$`匹配字符串结束,`\b`匹配单词边界...

    正则表达式.rar || 正则表达式.rar

    1. 分组:使用圆括号"( )"对部分表达式进行分组,可以方便地应用量词或操作符,同时还可以通过反向引用"\1"、"\2"等访问分组内容。 2. 预查:使用"?"后跟"="或"!",可以实现预查功能,如"ab(?=cd)"匹配"ab",但仅当...

    [精通正则表达式(第三版)].(美)佛瑞德.扫描版(modify).pdf

    3. 捕获组和反向引用:介绍如何使用捕获组提取匹配的部分,以及如何使用反向引用在替换中重新使用捕获的组。 4. 正则表达式在编程中的应用:探讨在不同编程语言中如何使用正则表达式,以及最佳实践。 5. 正则...

    正则表达式转换工具

    - 反向匹配:从目标字符串出发,生成能够匹配该字符串的正则表达式。 - 过滤和提取:根据正则表达式,过滤掉不相关的信息,或者提取特定部分的数据。 4. **正则表达式在编程中的应用** - 数据验证:在表单提交时...

    [Python]网络爬虫(七):Python中的正则表达式教程.pdf

    - 反向引用:通过`\1`、`\2`等方式引用之前定义的分组。 - 零宽断言:包括正向预查和负向预查,用来声明某个位置左右两侧应当符合的模式,但不消耗字符。 6. Python正则表达式的示例 - 编译正则表达式:`pattern...

    精通正则表达式~~~

    括号及反向引用... 20 神奇的转义... 22 基础知识拓展... 23 语言的差异... 23 正则表达式的目标... 23 更多的例子... 23 正则表达式术语汇总... 27 改进现状... 30 总结... 32 一家之言... 33 第2章:...

    精通正则表达式最新版

    5. 分组与反向引用:`()`用于分组,`\\n`表示引用第n个分组。 6. 非贪婪匹配:通过在量词后加上`?`实现,如`.*?`会尽可能少地匹配字符。 7. 查找与替换:在各种编程语言中,如何使用正则表达式进行查找和替换操作...

    Python正则表达式基础

    Python正则表达式是Python编程语言中的一个强大工具,用于处理和分析文本字符串。它允许开发者通过模式匹配来查找、替换或提取数据,广泛应用于数据清洗、文本挖掘、日志分析等领域。在Python中,正则表达式主要通过...

    pb 使用正则表达式源码pbregexp

    )、字符类、预定义字符集、反向引用等。这使得开发者能够处理复杂的文本处理任务。 标签“pb 正则表达式 pbregexp”进一步明确了讨论的主题,即在PowerBuilder中使用正则表达式,并且是通过“pbregexp”这一特定...

    正则表达式系统教程帮助文档

    2. 反向引用:`\数字`引用前面第n个括号内的内容,例如`(\w+)\s+\1`匹配重复的单词。 3. 位置锚点:`\b`表示单词边界,`\B`表示非单词边界。 4. 转义字符:元字符前加`\`进行转义,如`\.`匹配实际的点号,`\d`匹配...

    正则表达式(Deelx版)|正则表达式(Deelx版)支持库

    - **反向引用**:`\数字`引用前面相同编号的分组。 4. **使用场景** - **文本搜索**:在大量文本中查找符合特定模式的字符串。 - **数据验证**:在表单提交时,验证输入是否符合指定格式,如邮箱地址或电话号码...

    各类正则表达式详细手册

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。在IT行业中,正则表达式被广泛应用于数据验证、文本搜索、日志分析等多个领域。本详细手册涵盖了ORACLE+PLSQL、JavaScript以及C#三种...

    头歌教学实践平台 Web前端开发基础 JavaScript学习手册十:正则表达式

    在JavaScript中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于执行模式匹配和字符串操作。本篇教程将深入探讨JavaScript中的正则表达式,帮助你理解和掌握这一核心概念。 一、正则表达式基础 ...

    正则表达式完美教程+超实用的正则工具

    5. 分组与反向引用:圆括号`()`用于分组,`\数字`表示对前面第几个分组的引用。 二、正则表达式匹配技巧 1. 非贪婪匹配:默认情况下,量词是贪婪的,会尽可能多匹配。添加`?`可使其变为非贪婪,如`a*?`。 2. 定位...

    正则表达式工具(附正则表达式知识、示例)

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串。它们由特殊字符和普通字符组成,能够灵活地定义模式,用于在文本中执行复杂的搜索和替换操作。正则表达式(Regular Expression,简称regex...

    正则表达式综合练习

    12. **调试与测试**:使用在线工具(如Regex101、RegExr)可以帮助开发者调试和测试正则表达式,确保它们按预期工作。 总的来说,掌握正则表达式能够极大地提升你在处理字符串时的效率和灵活性。无论是简单的数据...

    06.正则表达式与SED.rar

    5. **分组与反向引用**:使用圆括号`()`创建分组,可以捕获子模式并用于后续操作,反向引用`\n`表示引用第n个捕获的子模式。 而`sed`(Stream Editor)是一个流式文本编辑器,它可以逐行处理输入流(文件或管道)中...

Global site tag (gtag.js) - Google Analytics