正则匹配-JS正则表达式的使用-method01

5个月前 (12-09) 0 点赞 0 收藏 0 评论 6 已阅读

背景:匹配和操控文本的方法,通过寻找目标字符中的特征进行字符匹配。

正则的作用
举个例子,这里有一个R语言中的向量my.vector<-c("aa01","bb02","cc03"),那么现在我想对向量中的每个值(文本)作一个操控,保留值中的所有字母信息,去掉值中的数字使得my.vectorc("aa","bb","cc"),就可以使用正则进行匹配:

my.vector<-c("aa01","bb02","cc03")
my.vector<-lapply(my.vector,function(e){
  gsub("[^0~9]","",e)
}) #'gsub()中第一个参数""中就代表正则匹配
my.vector<-as.vector(unlist(my.vector)) #'这里是R中list(列表)转换为vector(向量)
head(my.vector)

编程语言多种多样,正则在每种语言中都能使用,只是存在一些细小的差别,接下来介绍一下JavaScript中的正则规则。
通常,JS中正则表达式有两种创建方法:
(1)表达式
(2)对象实例化
表示式就是将匹配规则放在两个"/"中,对象实例化是将规则放在构造函数的参数中。

方法一 表达式-字面量正则表达式

const pattern=/test/; #'匹配"test"字符串
#'正则修饰符接在后一个"/"之后
#' i 对大小写不敏感
#' g 全局匹配
#' m 多行匹配
#' y 从最后一个位置开始匹配
#' exp : 
const pattern=/test/i; #'对大小写不敏感,"test"、"TEST"、"teST"等都能匹配上

创建RegExp对象的实例
RegExp这个构造函数就是用来构造一个JS的正则实例化对象。

const pattern=new RegExp("test"); #'此时的变量pattern就代表匹配字符串"test"
#'构造函数第二个参数代表字面量中的正则修饰符
const pattern=new RegExp("test","i") #'对大小写不敏感

匹配符合规则的字符的集合
匹配字符集使用的是"[]"。

#'exp  
const pattern=/[abc]/; #'表示匹配"a"、"b"、"c"中的任意一个字符,注意是一个
const pattern=/[^abc]/; #'表示匹配除了"a"、"b"、"c"的任意一个字符,"^"在这里重写,代表非

转义
什么是转义呢?转义就是正则规则中的一些字符代表了特定的含义,例如上面说的在[]中的^代表非,那么想匹配非自己呢?
则需要使用反斜杠"\"来转义,意思就是将特殊字符转为普通字符。
在字面量中转义仅需要一个"\";而在RegExp实例化中需要两个"\"。

#'exp 
const pattern=/[\^]/; #代表匹配一个^本身
const pattern=new RegExp("\\^"); #注意是双下划线

开始和结束的标识-起止符号
在"[]"以外的地方,^代表字符串起始位置;$代表字符串末尾。

const pattern=/^a/; #'匹配以"a"开头的字符串

规则匹配多次-重复出现
? 代表其前面的匹配内容出现0次或者1次,可以用于非贪婪模式。
+ 代表其前面的匹配项出现1次或者多次。
* 代表其前面的匹配项出现0次或者1次或者多次。

#'exp 
const pattern=/a+/; #'可以匹配aaa;而/a+?/则只会匹配一个a

此外,大括号"{}"也能代表规则的重复:
/a{4}/ 匹配4个连续的字符"a";
/a{4,6}/ 匹配4个-6个连续的字符"a";
/a{4,}/ 匹配4个或者更多个连续的字符"a"。

特殊含义的字符-转义字符

\d #'代表数字[0-9]
\D #'代表非数字
\w #'代表数字、字母、下划线
\W #'代表非数字、字母、下划线
\b #'空格
\r #'回车
\n #'换行符
. #'除了换行符(\n \r \u2028 \u2029)以外的任意字符

引用匹配内容中的某些内容-反向引用

/^([dtn])a\1/ #' "[dtn]"匹配的内容是"d"或者"t"或者"n"中任意一个字符,而"\1"代表第一次匹配到的[dtn]中的任意一个字符
#' "\1"即代表反向引用

正则表达式的编译

const a1=/test/g;
const a2=new RegExp("test","g");

a1!=a2,因为每个正则表达式都是独一无二的,构造函数实例化一个对象后,每个对象都有自己的内存空间,与原始数据类型(string,number等)不相同。

正则表达式的捕获

const transfromValue="isaytranslateYisatest";
const match=transfromValue.match(/translateY\(([^\)]+)\)/);

"()"是特殊匹配字符,代表一个捕获或者分组,而如果左右用\则表示转义匹配"()"本身。
/translateY\(([^\)]+)\)/中"\("与"\)"代表匹配"()"本身,内层没有被反斜杠包起来的"()"代表捕获。
match方法返回捕获到的值,match[0]中存放正则匹配到的所有结果,match[1]中存放的是"()"中捕获到的内容

const html="<div class="test"><b>this is a test</b></div>";
const results=html.match(/<(\/?)(\w+)([^>]*?)>/);
const all=html.match(/<(\/?)(\w+)([^>]*?)>/g);

字符串匹配结果如下:
results[0]=="<div class="test">"
results[1]==""
results[2]=="div"
results[3]=="class="test""
all[0]=="<div class="test">"
all[1]==<b>
all[2]==</b>
all[3]==</div>
可以看出局部正则表达式可以获得()中定义的3个捕获,全局正则表达式不能。

const tag=/<(\/?)(\w+)([^>]*?)>/g;
const match=tag.exec(html);

上述匹配或者捕获也可以使用正则的exec()方法,exec()方法使用全局匹配,返回每一次的局部的匹配以及捕获的结果。

捕获的引用(难度:***)超难!

#'反向引用
const html="<b class="test">hello</b><i>world!</i>";
const pattern=/<(/w+)([^>]*?)>(.*?)<\/\1>/g;
#' replace方法配合$1 $2的引用方法
“fontFamily”.replace(/([A-Z])/g,"-$1")=="fontfamily";
#' -$1代表匹配到的第一个大写字母
#' replace仅仅返回()中的捕获!
const pattern=/((?:ninjia-)+)sword;
const ninjia="ninjia-ninjia-sword".match(pattern);

?:代表不创建捕获,这样内层()仅仅代表分组,外层()代表捕获。

总结:正则是一个相当复杂的知识点,但是使用起来特别方便!建议多多学习,积累使用经验。


正则匹配-JS正则表达式的使用-method01

本文收录在
0评论

登录

忘记密码 ?

切换登录

注册