为了账号安全,请及时绑定邮箱和手机立即绑定

一个正则表达式问题!

一个正则表达式问题!

智慧大石 2019-02-20 19:44:20
需要匹配以Chapter|Section开头,以数字结尾的字符串如"Character 1","Section 132"但是只需要获得尾部数字一开始用了这个正则/^(?<=(?:Chapter|Section)[ t]*)d+$)/发现匹配不成功/(?<=(?:Chapter|Section)[ t]*)d+$)/去掉^可以就可以匹配到数字了 但是为什么加了^就不能匹配到了呢,是什么导致匹配失败了呢求解
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

?<=是断言,断言常和零宽这个词一起出现,零宽断言是在文本的某个位置判断这个位置前面或者后面的字符满足或者不满足一些条件,具体是向前还是向后,满足还是不满足就和具体的断言类型相关了。需要特别注意的是,断言只是匹配一个位置,并不匹配一个具体的字符,所以是零宽

/^(?<=(?:Chapter|Section)[ t]*)d+$)/这个正则

  1. 首先匹配字符串的开始;
  2. 然后是一个断言,这个断言用于判断该位置前面的字符满足Chapter|Section)[ t]*,注意此时匹配的位置并未发生改变,还是在字符串的开始;
  3. 然后匹配1到多个数字,注意开始匹配的位置还是在字符串的开始;
  4. 然后是字符串的结尾;

综上,结合1,3和4,这个字符串就是由1到多个数字组成的;结合2,这个字符串开始的前面还需要匹配一些字符,这明显是矛盾的,一个字符串的开始位置前面怎么还会有字符。所以这个正则什么也匹配不了。

/(?<=(?:Chapter|Section)[ t]*)d+$)/去掉^以后,这个正则匹配成功的条件是在字符串中存在这样一个位置,这个位置前面满足Chapter|Section)[ t]*,后面是1到多个数字,然后是字符串的结尾。

查看完整回答
反对 回复 2019-03-01
?
慕容森

TA贡献1853条经验 获得超18个赞

^放在(?:)前面。

需要匹配以Chapter|Section开头,以数字结尾的字符串

并不是加了^就会出错,而是位置不对。
去掉^只是规避掉这个问题而非解决,毕竟带不带^是有边界区别的。

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 416 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信