正则表达式的一些高级用法

本文介绍正则表达式的高级应用,包括排除特定模式、非贪婪匹配、防止ReDoS攻击的方法及正则表达式的常见用途。文章还对比了方括号[]与圆括号()在匹配中的区别,并介绍了Python中re模块的不同搜索方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 不允许出现某个单词,使用?!
    (?!Pattern).\.matches
    表示.matches之前的不能是Pattern
  2. 非贪婪匹配,在匹配项后加?
    matches\((.*?)\)
    这里在.*后加问号,表示尽可能少的匹配。
  3. \w表示字母、数字和下划线
  4. 防范redos攻击,可使用Cyber-Redos-Terminator检查开发使用的正则表达式。java代码里排查可能的redos攻击,可使用下面三个正则式:
    REG_CALL_PAT1 = re.compile("Pattern\\.compile\\((.*)\\)")
    REG_CALL_PAT2 = re.compile("Pattern\\.matches\\((.*),.*\\)")
    REG_CALL_PAT3 = re.compile('(?!Pattern).\\.matches\\((".*"|[\\w\\.]+)\\)')
  1. []与()的区别:
    [a-z]表示a到z里面的某个字符
    (ab|bc)表示是ab或bc之一,()相比[]来说,可以匹配多个连续字符,而[]只能匹配一个字符。
    [^a-z]表示非小写字母的某个字符,依然只匹配一个字符,[]里面的幂符号表示否定。
    一个很常见的用途是,我匹配一个用单引号括起来的字符串,字符串内只能出现2个连续的单引号,而不能再出现单个单引号。这样的正则可以这么写:
    ‘([^’\n]|‘’)*’

  2. python里,re.match表示从头开始匹配,没匹配到返回None。re.search则表示从任意位置开始匹配。re.match和re.search都只会找第一个匹配,若要找到所有匹配,要用re.findall,findall会返回所有匹配的分组列表。且,python并不区分是普通模式还是分组捕获模式(capture),后者仅仅是返回的MatchObject对象支持group(1)、group(2)…方法来获取捕获的分组值。
    rust里则无此种能力,find等价于python的search,从任意位置开始匹配,且只匹配一次;find_iter找到所有匹配。但find和find_iter都只对应于普通模式,要做分组捕获,得使用captures方法。
    java里,Matcher.matches从头开始匹配,Matcher.find则表示从任意位置开始匹配。

  3. 位置匹配。像^表示开始,$表示结束,都是位置匹配符。再比如,要将驼峰写法的单词拆开,可用下面的正则:

re.compile(r"[A-Z]?[a-z]+|[A-Z]+(?=[A-Z]|$)")

其中,?=也是位置匹配,表示在大写字母或结束之前的位置。

  1. 点号是否能代表换行符?默认不代表,在python里可用re.DOTALL令其代表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值