正则表达式(英语:Regular Expression)原属于计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里边,正则表达式通常被用来检索、替换那些符合某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,Perl,Shell,R,Java等等。
元字符 | 描述 |
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。
|
^ | 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 |
* | 匹配前面的子表达式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”。*等价于{0,}。
|
+ | 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。 |
{n} | n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
|
{n,} | n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。 |
元字符是一个预定义的字符。
正则表达式 | 描述 |
\d | 匹配一个数字,是 [0-9] 的简写 |
\D | 匹配一个非数字,是 [^0-9] 的简写 |
\s | 匹配一个空格,是 [ \t\n\x0b\r\f] 的简写 |
\S | 匹配一个非空格 |
\w | 匹配一个单词字符(大小写字母、数字、下划线),是 [a-zA-Z_0-9] 的简写 |
\W | 匹配一个非单词字符(除了大小写字母、数字、下划线之外的字符),等同于 [^\w] |
限定符定义了一个元素可以发生的频率。
正则表达式 | 描述 | 举例 |
* | 匹配 >=0 个,是 {0,} 的简写 | X* 表示匹配零个或多个字母 X,.*表示匹配任何字符串 |
+ | 匹配 >=1 个,是 {1,} 的简写 | X+ 表示匹配一个或多个字母 X |
? | 匹配 1 个或 0 个,是 {0,1} 的简写 | X? 表示匹配 0 个或 1 个字母 X |
{X} | 只匹配 X 个字符 | \d{3} 表示匹配 3 个数字,.{10}表示匹配任何长度是 10 的字符串 |
{X,Y} | 匹配 >=X 且 <=Y 个 | \d{1,4} 表示匹配至少 1 个最多 4 个数字 |
*? | 如果 ? 是限定符 * 或 + 或 ? 或 {} 后面的第一个字符,那么表示非贪婪模式(尽可能少的匹配字符),而不是默认的贪婪模式 |
Java中的反斜杠:反斜杠 \ 在 Java 中表示转义字符,这意味着 \ 在 Java 拥有预定义的含义。
这里例举两个特别重要的用法:
- 在匹配 . 或 { 或 [ 或 ( 或 ? 或 $ 或 ^ 或 * 这些特殊字符时,需要在前面加上 \\,比如匹配 . 时,Java 中要写为 \\.,但对于正则表达式来说就是 \.。
- 在匹配 \ 时,Java 中要写为 \\\\,但对于正则表达式来说就是 \\。
注意:Java 中的正则表达式字符串有两层含义,首先 Java 字符串转义出符合正则表达式语法的字符串,然后再由转义后的正则表达式进行模式匹配。
表达式:[ ]与()
- [jpg|png] 代表匹配 j 或 p 或 g 或 p 或 n 或 g 中的任意一个字符。
- (jpg|png) 代表匹配 jpg 或 png。
正则中的前瞻,后顾,负前瞻,负后顾四个概念
前瞻: exp1(?=exp2) 查找exp2前面的exp1
后顾: (?<=exp2)exp1 查找exp2后面的exp1
负前瞻: exp1(?!exp2) 查找后面不是exp2的exp1
负后顾: (?<!=exp2)exp1 查找前面不是exp2的exp1
如:b.regexp("(?<!\\\\)[\\s]*+")表示匹配前面不是\\的n(n>=0)个空格
[\\s]* 表示>=0 个空格
如:b.regexp("([^=:\\s]|(?<=\\\\)\\ |(?<=\\\\)\\=|(?<=\\\\)\\:)+")
(?<=\\\\)表示 \
表示匹配字符串以=:空格其中一个开始 或 \\ 或 \\= 或 \\: 多个
例如:b.regexp("^\\[.*?\\]$") 匹配前后[ ]
例如:b.regexp("^\\s*+\\-\\s") 匹配“ - xxxxx ”
中文匹配:
[\u4e00-\u9fa5]+ 代表匹配中文字。
可以在正则的开头指定模式修饰符:
- (?i) 使正则忽略大小写。
- (?s) 表示单行模式("single line mode")使正则的 . 匹配所有字符,包括换行符。
- (?m) 表示多行模式("multi-line mode"),使正则的 ^ 和 $ 匹配字符串中每行的开始和结束。
————————————————
版权声明:本文为CSDN博主「lxlmycsdnfree」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lxlmycsdnfree/article/details/90257822