正则表达式

冷笑话一则:

正则表达式和正则化有什么关系啊?

正则化是防止过拟合的。

什么意思?

它俩没关系,你的脑子过拟合了。

规则

字符类

  • [abc]:匹配 ‘a’, ‘b’ 或 ‘c’ 中的任意一个字符。

    1
    [abc]

    示例:

    1
    a, b, c
  • [^abc]:匹配除了 ‘a’, ‘b’ 或 ‘c’ 以外的任意一个字符。

    1
    [^abc]

    示例:

    1
    d, e, 1, @
  • [a-z]:匹配从 ‘a’ 到 ‘z’ 范围内的任意一个字符。

    1
    [a-z]

    示例:

    1
    a, m, z
  • [0-9]:匹配从 ‘0’ 到 ‘9’ 范围内的任意一个字符。

    1
    [0-9]

    示例:

    1
    0, 5, 9

预定义字符类

  • .:匹配除换行符外的任意一个字符。

    1
    .

    示例:

    1
    a, 1, @, (space)
  • \d:匹配任意一个数字字符(等价于 [0-9])。

    1
    \d

    示例:

    1
    0, 5, 9
  • \D:匹配任意一个非数字字符(等价于 [^0-9])。

    1
    \D

    示例:

    1
    a, @, (space)
  • \w:匹配任意一个单词字符(字母、数字、下划线)。

    1
    \w

    示例:

    1
    a, 5, _
  • \W:匹配任意一个非单词字符。

    1
    \W

    示例:

    1
    @, (space), #
  • \s:匹配任意一个空白字符(空格、制表符、换行符等)。

    1
    \s

    示例:

    1
    (space), \t, \n
  • \S:匹配任意一个非空白字符。

    1
    \S

    示例:

    1
    a, 1, @

边界匹配

  • ^:匹配字符串的开始。

    1
    ^Hello

    示例:

    1
    2
    Hello world (匹配)
    world Hello (不匹配)
  • $:匹配字符串的结束。

    1
    world$

    示例:

    1
    2
    Hello world (匹配)
    world Hello (不匹配)
  • \b:匹配单词边界。

    1
    \bword\b

    示例:

    1
    2
    word (匹配)
    words (不匹配)
  • \B:匹配非单词边界。

    1
    \Bword\B

    示例:

    1
    2
    swordfish (匹配)
    word (不匹配)

量词

  • *:匹配前面的子表达式零次或多次。

    1
    a*

    示例:

    1
    '', 'a', 'aaa'
  • +:匹配前面的子表达式一次或多次。

    1
    a+

    示例:

    1
    2
    'a', 'aaa' (匹配)
    '' (不匹配)
  • ?:匹配前面的子表达式零次或一次。

    1
    a?

    示例:

    1
    2
    '', 'a' (匹配)
    'aa' (不匹配)
  • {n}:匹配前面的子表达式恰好 n 次。

    1
    a{3}

    示例:

    1
    2
    'aaa' (匹配)
    'aa', 'aaaa' (不匹配)
  • {n,}:匹配前面的子表达式至少 n 次。

    1
    a{2,}

    示例:

    1
    2
    'aa', 'aaa' (匹配)
    'a' (不匹配)
  • {n,m}:匹配前面的子表达式至少 n 次,至多 m 次。

    1
    a{2,4}

    示例:

    1
    2
    'aa', 'aaa', 'aaaa' (匹配)
    'a', 'aaaaa' (不匹配)

分组和捕获

  • ():定义子表达式的范围,并捕获匹配的文本。

    1
    (abc)

    示例:

    1
    2
    abc (匹配)
    aabc, abcc (不匹配)
  • |:表示选择,匹配的是 | 前或 | 后的表达式。

    1
    a|b

    示例:

    1
    2
    a, b (匹配)
    c, d (不匹配)

示例

匹配电话号码

假设有一个包含电话号码的文本,我们想匹配格式为 (123) 456-7890 的电话号码:

1
\(\d{3}\) \d{3}-\d{4}
  • \(:匹配左括号 (
  • \d{3}:匹配三个数字。
  • \):匹配右括号 )
  • :匹配空格。
  • \d{3}:匹配三个数字。
  • -:匹配连字符 -
  • \d{4}:匹配四个数字。

匹配电子邮件地址

1
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

解释:

  • ^[a-zA-Z0-9._%+-]+:匹配以字母、数字、点、下划线、百分号、加号、减号组成的一个或多个字符开头。
  • @:匹配 @ 符号。
  • [a-zA-Z0-9.-]+:匹配域名的一部分,可以包含字母、数字、点、减号。
  • \.:匹配点字符。
  • [a-zA-Z]{2,}$:匹配顶级域名部分,由两个或更多字母组成。
  1. 匹配 URL
1
^(https?|ftp)://[^\s/$.?#].[^\s]*$

解释:

  • ^(https?|ftp)://:匹配以 http、https 或 ftp 开头的 URL。
  • [^\s/$.?#]:匹配非空白字符、斜杠、美元符号、点、问号、井号的字符。
  • [^\s]*$:匹配除空白字符以外的任意字符,零次或多次,直到字符串结束。

使用

Java

需要使用使用 java.util.regex 包中的 PatternMatcher

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.regex.*;

public class Main {
public static void main(String[] args) {
// 正则表达式
String pattern = "^(https?|ftp)://[^\s/$.?#].[^\s]*$";
Pattern compiledPattern = Pattern.compile(pattern);
// 测试字符串
String url = "ftp://ftp.example.com",
// 匹配
Matcher matcher = compiledPattern.matcher(url);
if (matcher.matches()) {
System.out.println("Matched: " + url);
} else {
System.out.println("Not matched: " + url);
}

}
}

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
import re
# 正则表达式
pattern = r'^(https?|ftp)://[^\s/$.?#].[^\s]*$'

# 测试字符串
url = 'https://www.example.com/path/to/resource',

# 匹配
if re.match(pattern, url):
print(f"Matched: {url}")
else:
print(f"Not matched: {url}")

在 Python 中,使用正则表达式时,建议在字符串前面加上 r(即创建原始字符串),以便更方便地处理正则表达式中的转义字符。这个 r 字母并不是正则表达式的一部分,而是 Python 字符串的一个标记,用于指示这是一个原始字符串(raw string)。

原始字符串使得正则表达式中的反斜杠 \ 不需要额外转义。例如,在正则表达式中,\\ 用于匹配一个字面上的反斜杠。如果你使用普通字符串,你需要写成 \\\\,因为每个反斜杠都需要转义一次。而在原始字符串中,你只需要写成 \\

JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
// 正则表达式
const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/;

// 测试字符串
url = 'http://example.com',

// 匹配
if (pattern.test(url)) {
console.log(`Matched: ${url}`);
} else {
console.log(`Not matched: ${url}`);
}

在 JavaScript 中,正则表达式通常是使用斜杠 / 来表示的,这种方式称为正则表达式字面量。正则表达式字面量是将正则表达式直接写在斜杠之间的方式

MySQL

1
2
3
SELECT url
FROM urls
WHERE url REGEXP '^(https?|ftp)://[^\s/$.?#].[^\s]*$';