jquery正则中⽂英⽂混合_正则表达式
数据/字符串处理是⼯作中经常能⽤到的,以前的做法⼤都是通过百度然后修改别⼈的代码完成字符串处理,⼀直想系统的跟正则认识⼀番,于是有了这篇。
点击《正则表达式》可查看原⽂哦!
同时⾮常感谢雪峰⼤⼤和鑫⼤⼤的⽂章⽀持,点击以下链接可查看参考原⽂。
雪峰⼤⼤的 标准对象/RegExp.
鑫⼤⼤的 粉丝第27期JS基础⼩测答疑⽂字版
好的,接下来进⼊正题啦。
正则表达式定义
正则表达式是对字符串操作的⼀种逻辑公式,⽤事先定义好的⼀些特定字符、及这些特定字符的组合,组成⼀个“规则字符串”,这个“规则字符串”⽤来表达对字符串的⼀种过滤逻辑。
举个例⼦:
'00d'可以匹配'007',‘008’,其中‘d’即匹配数字。
语法
元字符
量词
特殊字符
举例说明
数字、字母匹配(d匹配数字,w匹配任意字母,数字,下划线)
可⽤00d可以匹配007ddd可以匹配任意三位数字,如:123wdw可以匹配l0l
.匹配任意字符,则any.可匹配anya、anyb、anyc、anyd ......
配合上量词再看看d{3}表⽰匹配3个数字,例如010d{3,8}表⽰3-8个数字,例如1234567
再加上我们的范围[0-9a-zA-Z_]可以匹配⼀个数字、字母或者下划线[0-9a-zA-Z_]+可以匹配⾄少由⼀个数字、字母或者下划线组成的字符串,⽐如a100,0_Z,Py3000等等[a-zA-Z_][0-9a-zA-Z_]*可以匹配由字母或下划线开头,后接任意个由⼀个数字、字母或者下划线组成的字符串,也就是Python合法的变量[a-zA-Z_][0-9a-zA-Z_]{0, 19}更精确地限制了变量的长度是1-20个字符(前⾯1个字符+后⾯最多19个字符)
啊,还有我们的选择字符和定位A|B可以匹配A或B,所以(P|p)ython可以匹配Python或者python^表⽰⾏的开头,^d表⽰必须以数字开头 $表⽰⾏的结束,d$表⽰必须以数字结束
你可能注意到了,py也可以匹配python,但是加上^py$就变成了整⾏匹配,就只能匹配py了
字符串的切割
最常⽤的应该就是split切割了,但是当字符串之间不仅仅是单⼀字符连接,切割就会出现问题,⽐如下⾯的例⼦
//出现多余空格情况:
'a b c'.split(' '); // ['a', 'b', '', '', 'c']
//嗯,⽆法识别连续的空格,⽤正则表达式试试:
'a b c'.split(/s+/); // ['a', 'b', 'c']
//⽆论多少个空格都可以正常分割。加⼊,试试:
'a,b, c d'.split(/[s,]+/); // ['a', 'b', 'c', 'd']
//再加⼊;试试:
'a,b;; c d'.split(/[s,;]+/); // ['a', 'b', 'c', 'd']
//如果⽤户输⼊了⼀组标签,下次记得⽤正则表达式来把不规范的输⼊转化成正确的数组。
字符串的分组应⽤
除了简单地判断是否匹配之外,正则表达式还有提取⼦串的强⼤功能。⽤()表⽰的就是要提取的分组(Group)。⽐如:^(d{3})-(d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:
var re = /^(d{3})-(d{3,8})$/;
<('010-12345'); // ['010-12345', '010', '12345']
<('010 12345'); // null
如果正则表达式中定义了组,就可以在RegExp对象上⽤exec()⽅法提取出⼦串来。
正则表达式提取中文字符exec()⽅法在匹配成功后,会返回⼀个Array,第⼀个元素是正则表达式匹配到的整个字符串,后⾯的字符串表⽰匹配成功的⼦串。
exec()⽅法在匹配失败时返回null。
提取⼦串⾮常有⽤。来看⼀个更凶残的例⼦:
var re = /^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$/;
<('19:05:30'); // ['19:05:30', '19', '05', '30']
对于’2-30’,’4-31’这样的⾮法⽇期,⽤正则还是识别不了,或者说写出来⾮常困难,这时就需要程序配合识别了。
以下内容参见鑫⼤⼤博客内容:
1、中英⽂之间需要增加空格
⾸先,我们的思路应该是“中⽂”、“英⽂”、“空格”,于是我们可得到 /(中⽂+英⽂+|英⽂+中⽂+)/g 这样的符号表达
转换成正则符号即: /([u4e00-u9fa5]+[A-Za-z]+|[A-Za-z]+[u4e00-u9fa5]+)/g
其中[u4e00-u9fa5]表⽰中⽂字符匹配;[A-Za-z]表⽰全部的英⽂字母。斜杠后⾯的g表⽰全局匹配,除了g,还有i和m。其中i表⽰不区分⼤⼩写,m表⽰⽀持多⾏匹配。
这⾥的括号和加号可化简,则最终可表达为: /[u4e00-u9fa5][a-z]|[a-z][u4e00-u9fa5]/gi、
2、全⾓标点与其他字符之间不加空格
这⾥如果直接⽤正则表达式,会显得冗余且不易懂,故使⽤RegExp对象简化
// 全⾓标点字符们
var strPunct = '!()【】『』「」《》“”‘’;:,。?、';
// 使⽤管道符连接
var regPunct = strPunct.split('').join('|');
// 此时的正则表达式
new RegExp('['+ regPunct +'] +| +['+ regPunct +']', 'g');
这样就显得简洁多了
其中,空格使⽤普通空格字符进⾏匹配的,⽽不是s,这样可以避免把换⾏符也过滤掉了
3、不重复使⽤标点符号
这⾥的标点指中⽂标点,因为英⽂标点不重复,有些不切实际,例如空字符串’’,就是合法的重复标点。
使⽤正则表达式:
/(~|`|!|[|]|{|}|;|:|"|'|,|<|.|>|/|?|!|·|【|】「」|;|:|“|”|,|《|。|》|、|?)1+/g
使⽤RegExp对象简化:
new RegExp(`(${regPunct})1+`, 'g')
这样就是不使⽤重复中⽂标点了。
其中,这⾥的1有必要好好说下。1表⽰捕获匹配,表⽰捕获第⼀个分组括号中匹配的值,你可以理解为代称。在正则表达式中,每⼀个分组括号()都⾃带⼀个看不见的序号,从前往后依次是分组⼀,分组⼆,分组三……
这⾥的1就表⽰匹配的第⼀个标点,后⾯跟了个+则表⽰,这⾥重复标点2个或多个都匹配。
捕获分组不仅存在于正则表达式中,当我们使⽤replace⽅法进⾏正则替换的时候,也存在与替换⽅法中,使⽤美元符号$外加数字表⽰,例如前后空格过滤trim()⽅法的简易polyfill:
if (!''.trim) {
im = function () {
// $1表⽰第⼀个()中匹配的值
place(/^s*(.*?)s*$/, '$1');
};
}
其中’$1’并不是替换成字符串$1意思,⽽是替换成第⼀个()中匹配的值,在这⾥表⽰⾸尾空格以外的值。 如果我们需要对捕获分组内容进⾏额外处理,可以把第⼆个参数作为function处理,例如:
// matches表⽰完整匹配内容(包括前后空格)
// $1则表⽰第⼀个()中匹配的值
// 此时就可以对$1进⾏处理,返回我们需要的值
})
4、破折号前后需要增加⼀个空格
这个⽐较简单,可直接获得:
/S——|——S/g
5、使⽤全⾓中⽂标点
正则表达式
/([^A-Za-z][~|`|!|[|]|{|}|;|:|"|'|,|<|.|>|/|?][^A-Za-z])/g
使⽤RegExp对象处理:
var strPunctHalf = '!()[]"';:,.?';
// 不同于全⾓字符,半⾓字符需要加转义
var regPunctHalf = strPunctHalf.split('').join('|');
/
/ 此时的正则表达式
new RegExp(`[u4e00-u9fa5][a-z]*( *[${regPunctHalf}] *)|( *[${regPunctHalf}] *)[a-z]*[u4e00-u9fa5]`, 'gi');
6、数字使⽤半⾓/[uFF10-uFF19]+/g
7、遇到完整的英⽂整句,其內容使⽤半⾓标点
正则表达式
/(「[A-Za-zs~|`|!|;|:|"|'|,|<|.|>|/|?]*[!|·|;|:|“|”|,。|、|?][^」]*」)|(《[A-Za-zs~|`|!|;|:|"|'|,|<|.|>|/|?]*[!|·|;|:|“|”|,。|、|?][^》]*》)/g RegExp对象处理:
new RegExp(`([a-z]+[${regPunct}|s])+[a-z]*([${regPunct}|s][a-z]+)+`, 'gi')
啦啦啦~正则表达式的介绍就先到这⾥啦,怎么样,动⼿使⽤吧~~~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论