正则表达式 之 回溯引用:前后一致匹配

前言  正则表达式的用途很多,特别是在查找替换,文本处理,爬虫项目中应用更是很多:

  • 复杂的字符串搜寻、替换工作,无法用简单的方式(类似借助标准库函数)达成。
  • 能够帮助你进行各种字符串验证。
  • 不止应用于编程语言中:JavaScript、JAVA、Perl、PHP、C#...
  • 也应用于许多操作系统的主流指令中:Linux/Unix、Mac、Windows PowerScript

由于正则表达式的流派很多,且关于JavaScript中的正则表达式的具体使用可以参照 MDN参考手册 或者这篇 博文 《玩转JavaScript正则表达式,而我此篇文章讲述的主要关于 回溯引用,主要是参考 《正则表达式必知必会》一书。

介绍

先说点基本语法,正则表达式的创建方式如下两种,直接使用对象字面量(推荐)或者使用RegExp构造函数创建:

var pattern1 = /aabb/;
var pattern2 = new RegExp(‘aabb‘);

我们来看一个情形,在一篇HTML文档中,我们要匹配所有 标题标签(<h1>-<h6>以及其结束标签)

var sentence=`<h1><wbr>正则表达式</h1>
        Content is divided into two sections;
        <h2>subTitle</h2>
        another line`
var re = /<[hH][1-6]>.*?<\/[hH][1-6]>/g;
console.log(sentence.match(re));

我们使用如上正则表达式,看起来似乎是对的,但是我们来看看这个例子

var sentence =`<h1><wbr>正则表达式</h1>
      Content is divided into two sections;
      <h2>subTitle</h3>
      another line`

这样子并不合法,所以我们要做的便是利用回溯引用来解决这个问题

回溯引用匹配 · 基本知识点

1.(x) 匹配 ‘x‘ 并且记住匹配项。括号被称为 捕获括号

2. 回溯引用只能引用子表达式(即捕获括号()括起的正则表达式片段)

3.  \   用于标识回溯引用, \1 对应第1个子表达式,\2 对应第2个子表达式,以此类推,\0对应整个正则表达式。

(但是在替换操作中,必须使用$代替\)

 看了这些知识点,还是来点例子,容易记一些~

 1.我们继续看看上面那个例子,如果换成下面的正在表达式

var re = /<[hH]([1-6])>.*?<\/[hH]\1>/g;

这一次总算是正确了

3. 再看freecodeCamp上的一道题,原题链接 :here

Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.

比如: spinalCase("AllThe-small Things") should return "all-the-small-things"

function spinalCase(str) {
  // "It‘s such a fine line between stupid, and clever."
  // --David St. Hubbins
  str = str.replace(/[^a-zA-Z]/g, ‘-‘)
    .replace(/\B[A-Z]\B/g, ‘-$&‘);
  return str.toLowerCase();
}

在这里,使用了回溯引用替换,$& 代表匹配的字符串

结束语

  稍微总结了一些关于回溯引用的使用,关于正则表达式的内容还有很多,如果有什么错误的地方,希望大家可以不吝赐教,谢谢,祝大家开开心心~

时间: 2024-10-02 15:53:13

正则表达式 之 回溯引用:前后一致匹配的相关文章

常用正则表达式大全!(例如:匹配中文、匹配html)

匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 匹配首尾空白

Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用

Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用 //准备: 我们先写一个搜索所有英文单词的表达式 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   reg.Subject := 'one two three four five six seven eight nine ten';   reg.RegEx  := '\b[A-Za-z]+\b'; //这个表达式就可以找到所有的英文单词   reg.

python 正则表达式 贪婪模式的简介和匹配时的几种模式

看到一篇文章,关于python正则的,http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 贪婪模式与非贪婪模式: 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符:非贪婪的则相反,总是尝试匹配尽可能少的字符.例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb".而如果使用

[ 转载 ] 什么是正则表达式的贪婪与非贪婪匹配

http://www.cnblogs.com/xudong-bupt/p/3586889.html 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配.如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c). 非贪婪匹配:就是匹配到结果就好,就少的匹配字符.如上面使用模式p匹配字符串str,结果就是匹配到:abc(

正则表达式的回溯[转]

1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“-”,“_”等看到这个要求的时候,自然而然地想到了正则表达式.于是就有了下面的表达式(写的比较龊): ^([A-Za-z0-9._()&'\- ]|[aAàÀ??ãÃáÁ??????????????âÂ??????????bBcCdD??eEèÈ????éÉ??êÊ??????????fFgGhHiIì

PHP正则表达式的逆向引用与子模式 php preg_replace应用

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) 功能 在 subject 中搜索 pattern 模式的匹配项并替换为 replacement.如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换.replacement可以包含\\n形式或$n形式的逆向引用,n可以为0到99,\\n表示匹配pattern第n个子

正则表达式(grep命令下的匹配)

基本正则表达式:REGular EXPression(REGEXP) 一.元字符: .  :匹配任意单个字符: [] :匹配指定范围内的任意单个字符: [^]:匹配指定范围外的任意单个字符. PS:常用字符集合 [:digit:] -- 数字集合 [:lower:] -- 小写字母集合 [:upper:] -- 大写字母集合 [:space:] -- 空格 [:alpha:] -- 所有字母集合 [:alnum:] -- 所有字母和数字集合 二.次数匹配: * : 匹配其前面的字符任意次: .*

正则表达式中,如何在任意匹配字符后面加上原字符和特定内容

数据的中间,时间格式上没有秒, 10.7.98.204,10.4.177.5,wb_gh017,2018/7/1 23:58,00-71-C2-0D-D3-BA,110.7.98.204,10.4.177.5,wb_gh017,2018/7/1 23:58,00-71-C2-0D-D3-BA,010.7.21.148,10.7.31.143,shenzhen,2018/7/1 23:57,00-05-9A-3C-7A-00,010.7.82.28,192.168.22.4,panwei,2018

正则表达式学习(一)-- 字符匹配

文章首发于[sau交流学习社区](https://www.mwcxs.top/page/585.html) 一.前言 正则表达式是匹配模式,要么匹配字符,要么匹配位置. 正则里面的元字符太多了,没有系统性,可以分为: (1)字符匹配攻略 (2)位置匹配攻略 二.字符匹配 包括:两种模糊匹配,字符数组,量词,分支结构. 1.1两种模糊匹配 正则精确匹配乜有意义的,比如正则/saucxs/,只能匹配字符串中的"saucxs"这个子串. var regex = /saucxs/; conso