第一种:JavaScript(ES6)
A:分隔符:
例如:reg=/\d(.)\1/g (切记:不能带单引号和双引号)
X:ES6之新规则:s 修饰符:dotAll 模式
正则表达式中,点(.
)是一个特殊字符,代表任意的单个字符,但是行终止符(line terminator character)除外。
以下四个字符属于”行终止符“。
- U+000A 换行符(
\n
) - U+000D 回车符(
\r
) - U+2028 行分隔符(line separator)
- U+2029 段分隔符(paragraph separator)
所以引入/s
修饰符,使得.
可以匹配任意单个字符。
X:ES6之新规则:ES6新增 之命名捕获(具名组匹配)和反向引用命名捕获的规则!
//ES6新增 之命名捕获(具名组匹配)和反向引用命名捕获的规则!
let str = "2019-2019-2019-2019";
//不给分组起别名
let reg = /(\d{4})-(\d{2})-(\d{2})/;
//命名捕获的格式:?<组别名>
//反向引用命名捕获组格式:\k<组名> 或\1...n
//这里的k<year> 等价于(?<year>\d{4}) 也等价于\1
let reg = /(?<year>\d{4})-\k<year>-\1/;
//String字符串类中的match方法(正则后面不能带g,否则无法查询分组模式,详情查询官方文档)
console.log( str.match(reg) );
console.log( str.match(reg).groups); //注意这里的groups不是一个函数!
//输出为:
/**
* (2) ["2019-2019-2019", "2019", index: 0, input: "2019-2019-2019-2019", groups: {…}]
0: "2019-2019-2019"
1: "2019"
groups: {year: "2019"}
index: 0
input: "2019-2019-2019-2019"
length: 2
__proto__: Array(0)
*/
B:分组替换模式
字符串替换:replace(r"(.)\1",r"\1",ss)用$0...n访问子组,其中$0代表完全代表完整的模式匹配文本!
函数替换:函数参数($0,$1...$n)
//JavaScript中的 replace分组替换方法!
let str = "2019-01-07-59";
//不给分组起别名
// let reg = /(\d{4})-(\d{2})-(\d{2})/;
//命名捕获的格式:?<组别名>
//反向引用命名捕获组格式:\k<组名> 或\1...n
let reg = /(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/;
//String字符串类中的replace方法(参数为回调函数)等价于str.replace;
reg[Symbol.replace](str, ($,$0,$1,$2) => {
console.log($,$0,$1,$2); //输出结果为:2019-01-07 2019 01 07
});
//$,$0...n的参数也可以用ES6的扩展运算符...来接收更方便
reg[Symbol.replace](str, (...args) => {
console.log(...args); //输出结果为:2019-01-07 2019 01 07 0 2019-01-07-59 {y: "2019", m: "01", d: "07"}
});
//String字符串类中的replace方法(参数为字符串)
//这里注意:replace如何替换时参数是字符串,ES6中用的是$1...n , python,引用用\1...n 这点和python不一样!!
//等价于reg[Symbol.replace](str,newStr)方法
console.log( str.replace(reg,"$1")); //输出结果为:2019-59 把整个匹配结果替换为$1
C:分组查询模式:(match正则后不能带g,否则无法显示分组的结果!)
ES6支持分组命名捕获格式: ?<别名> (非常重要,自动转换成json格式了)
//ES6中的match查询匹配使用
let str = "2019-01-07";
//不给分组起别名
let reg = /(\d{4})-(\d{2})-(\d{2})/;
//给分组起别名的格式:?<别名>
let reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
//String字符串类中的match方法(正则后面不能带g,否则无法查询分组模式,详情查询官方文档)
console.log( str.match(reg) );
console.log( str.match(reg).groups() );
//RegExp类中的regexp[Symbol.match](str)方法,等价于//String字符串类中的match方法!
console.log( reg[Symbol.match](str) );
console.log( reg[Symbol.match](str).groups() );
/**
* (4) ["2019-01-07", "2019", "01", "07", index: 0, input: "2019-01-07", groups: {…}]
0: "2019-01-07"
1: "2019"
2: "01"
3: "07"
groups: {year: "2019", month: "01", day: "07"}
index: 0
input: "2019-01-07"
length: 4
__proto__: Array(0)
*/
第二种:python正则表达式:
A:分隔符
例如:reg=r'\d(.)\1'或r"\d(.)\1",
r代表原始字符串。因为没有//来包裹,如果不加r的话,\1必须加上\\1才可以转义。
如:reg="\d(.)\\1",建议用r原始字符串方式
B:分组替换模式
核心要点:字符串替换:re.sub(r"(.)\1",r"\1",ss)用\0....n访问子组,\0代表完全代表完整的模式匹配文本
函数替换:函数参数为一个元组
#python中的字符串查询匹配分组常用方法!
#re.match(必须从第一个字符开始匹配) 和 re.search(仅匹配第一个位置) 这两个查询匹配方法用的少!
#re.match和re.search返回的是一个match对象,里边也有group和groups方法
#re.findall(查询匹配最常用的方法)
import re;
ss = "2019-01-07"
reg = r"(\d{4})-(\d{2})-(\d{2})"
#sub参数为回调函数的情况:
def replace(matchobj):
print(matchobj.groups()) #输出结果为:('2019', '01', '07')
re.sub(reg,replace,ss)
#sub参数为字符串的情况:
#把reg匹配的结果整体替换成\1(值为2019)
#这里注意:sub为字符串替换时,引用用\1...n 这点和JavaScript不一样,ES6中用的是$1...n!!
print( re.sub(reg,r"\1",ss)) #结果为2019。
C:查询替换模式
#python中的字符串查询匹配分组常用方法!
#re.match(必须从第一个字符开始匹配) 和 re.search(仅匹配第一个位置) 这两个查询匹配方法用的少!
#re.match和re.search返回的是一个match对象,里边也有group和groups方法
#re.findall(查询匹配最常用的方法)
import re;
ss = "2019-01-07"
reg = r"(\d{4})-(\d{2})-(\d{2})"
print( re.findall(reg,ss) ) #输出结果为:[('2019', '01', '07')];