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

Posted Kasmine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式 之 回溯引用:前后一致匹配相关的知识,希望对你有一定的参考价值。

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

  • 复杂的字符串搜寻、替换工作,无法用简单的方式(类似借助标准库函数)达成。
  • 能够帮助你进行各种字符串验证。
  • 不止应用于编程语言中: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();
}

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

 

结束语

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

 

以上是关于正则表达式 之 回溯引用:前后一致匹配的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式之原理篇

《正则表达式必知应会》读书

正则表达式匹配回溯

正则表达式回溯法原理

第977期正则表达式回溯法原理

如何优化我的回溯解决方案以匹配正则表达式?