- 不允许出现某个单词,使用?!
(?!Pattern).\.matches
表示.matches之前的不能是Pattern - 非贪婪匹配,在匹配项后加?
matches\((.*?)\)
这里在.*后加问号,表示尽可能少的匹配。 - \w表示字母、数字和下划线
- 防范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\\.]+)\\)')
-
[]与()的区别:
[a-z]表示a到z里面的某个字符
(ab|bc)表示是ab或bc之一,()相比[]来说,可以匹配多个连续字符,而[]只能匹配一个字符。
[^a-z]表示非小写字母的某个字符,依然只匹配一个字符,[]里面的幂符号表示否定。
一个很常见的用途是,我匹配一个用单引号括起来的字符串,字符串内只能出现2个连续的单引号,而不能再出现单个单引号。这样的正则可以这么写:
‘([^’\n]|‘’)*’ -
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则表示从任意位置开始匹配。 -
位置匹配。像^表示开始,$表示结束,都是位置匹配符。再比如,要将驼峰写法的单词拆开,可用下面的正则:
re.compile(r"[A-Z]?[a-z]+|[A-Z]+(?=[A-Z]|$)")
其中,?=也是位置匹配,表示在大写字母或结束之前的位置。
- 点号是否能代表换行符?默认不代表,在python里可用re.DOTALL令其代表。