正则表达式总结(JavaScript、python、PHP、golang、C++、java、C#)之汇总

第一种: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')];

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值