基本语法
表达式 | 描述 |
---|---|
定位符 | |
^ | 匹配字符串的开始位置。在 [] (方括号)中使用时,表示不匹配 [] 中的字符集合。要匹配 ^ 字符,请使用 \^ |
$ | 匹配字符串的结尾位置。只有设置了 RegExp 对象的 Multiline 属性,才会匹配 \n 或 \r 。要匹配 $ 字符,请使用 \$ |
\b | 匹配一个单词的边界,即字与空格间的位置 |
\B | 非单词边界匹配 |
数量表示 | |
? | 匹配前面的子表达式零次或一次。要匹配 ? 字符,请使用 \? |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+ |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \* |
| | 或运算符,指明两项之间匹配任意一个。要匹配 | ,请使用 \| |
{m} | 匹配前面的表达式m个 |
{m,} | 匹配前面的表达式最少m个 |
{m,n} | 匹配前面的表达式最少m个,最多n个 |
字符 | |
. | 匹配除换行符 \n 以外的任何单个字符。要匹配 . 字符,请使用 \. |
\ | 转义字符 |
\w | 匹配任何字母数字,包括下划线(等价于 [A-Za-z0-9_] ) |
\W | 匹配任何非字母数字以及下划线(等价于 [^A-Za-z0-9_] ) |
\d | 匹配任何数字 |
\D | 匹配任何非数字 |
\s | 匹配任何空白字符,包括空格、制表符等 |
\S | 匹配任何非空白字符 |
[abc] | 匹配集合中包含的任一字符 |
[^abc] | 匹配任何不在集合中的字符 |
[a-z] | 匹配指定范围内的任意字符 |
分组和引用 | |
(expression) | 匹配括号里的整个表达式 |
(?:expression) | 匹配括号里的整个字符串但不获取匹配结果,拿不到分组引用 |
\num | 对前面所匹配分组的引用。比如 (\d)\1 可以匹配两个相同的数字,(a)\1 会匹配到 aa , (a)(b)\1\2 会匹配到 abab |
断言 | |
(?=) | 正向预查 |
(?!) | 正向否定预查 |
(?<=) | 反向预查 |
(?<!) | 反向否定预查 |
修饰符
正则表达式的修饰符用于指定额外的匹配策略,格式如下:
/pattern/flags
/.../i
/.../g
/.../m
修饰符 | 描述 |
---|---|
i | ignore - 不区分大小写 |
g | global - 全局匹配 |
m | multi line - 多行匹配 |
s | . 匹配符会匹配 \n 换行符,默认不匹配 |
x | 忽略空格 |
e | 配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行。 |
A | 强制从目标字符串开头匹配,相当于元字符^。 |
Z | 强制以目标字符串结尾匹配,相当于元字符$。 |
D | 模式中$仅匹配目标字符串结尾,不可与换行符\n匹配,无它可以匹配换行符结尾的字符串。 |
U | 只匹配最近的一个字符串;不重复匹配。 |
Java - Pattern 类
Java 语言中使用正则表达式,需要借助 Pattern
类:
public final class Pattern implements java.io.Serializable {
...
}
Pattern
类用于创建一个正则表达式,通过两个静态方法调用私有构造器创建:
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
public static Pattern compile(String regex, int flags) {
return new Pattern(regex, flags);
}
第一个参数是正则表达式,第二个参数是匹配模式(一个16进制的标识,Pattern
中定义的常量),对应上面的 修饰符
下面分别举例说明:
1:Pattern.CASE_INSENSITIVE
等同于修饰符 i
: 不区分大小写。
2:m 可以匹配多行字符,即字符串中包括换行也可以,如: 字符串 ”bacd\nabde\nabgh",匹配规则:/ab/ ,没有匹配字符串,规则:/ab/m 可以匹配到第二行,第三行其实也是相符的,但单加上m只匹配到第一条,在python中使用re.findall就匹配全部,这个参数在此函数中不起作用。
3:g 全局匹配,上面规则改成:/ab/mg 就会匹配所有符合条件的字符,无论多少行,上面例子可以匹配后两行,python无些参数,本身就是全局搜索。
4:s 可以匹配换行符。如: 字符串 ”bacd\nabde\nabgh",re.findall(‘cd.’,s),没有匹配字符串,改成:re.findall(‘cd.’,s,re.S),就可以匹配’cd\n’,也就是加了这个修正符,可以将\n视为一个换行符号,否则将视为普通字符。
5:X,忽略模式中空格,如: 字符串 ”bacd\nabde\nabgh",re.findall(’ c d’,s),没有匹配的字符串,改成:re.findall(’ c d’,s,re.X),就和’cd\n’中的cd匹配成功。
6:A 强制从头开始匹配。如: 字符串 ”bacdefg", /ac/gi能匹不个字符,因为不是ac开头的,python中的re.A参数表示的是ascii码,在python中本身就是从头搜索的,所以无些参数。
7:Z 强制结尾匹配,/ab/Z,只能匹配字符串“efgab",而不能匹配"abcdef"因为不是以ab结尾的,python中fqhx无此参数。
8:D 不可匹配结尾的换行符。/ef$/D不能匹配"abcdef\n",而只能匹配"abcdef",去除/D修正符,可以匹配两个字符串。
9:U 只匹配最近一个字符串,也就是第一次出现的,python中的re.search()本身就是搜索到第一次的,在python中re.U是指指定的目标串是Unicode字符串。
常用正则表达式(持续完善。。。)
匹配 .png
结尾的图片
\.png$
判断密码只能包含英文和数字
^[A-Za-z0-9]+$