正则表达式的概念可以分为几个大类,每个大类下有不同的特定元素。以下是这些概念的概述,包括预定义字符类的特定含义和每个大类的示例:
1. 基本匹配概念
- 字面量(Literals): 直接匹配指定的字符。
- 例子:
dog
匹配字符串中的 “dog”。
- 例子:
2. 元字符(Metacharacters)
- 点(Dot):
.
匹配除换行符外的任何单个字符。- 例子:
c.t
可以匹配 “cat”、“cbt”、“cct” 等。
- 例子:
3. 字符类(Character Classes)
- 自定义字符集:
[...]
匹配方括号内的任意字符。- 例子:
[aeiou]
匹配任何一个元音字母。
- 例子:
- 否定字符集:
[^...]
匹配不在方括号内的任意字符。- 例子:
[^aeiou]
匹配任何非元音字母的字符。
- 例子:
4. 预定义字符类(Predefined Character Classes)
\d
: 匹配任何数字字符,等价于[0-9]
。\D
: 匹配任何非数字字符,等价于[^0-9]
。\w
: 匹配任何单词字符(包括字母、数字以及下划线),等价于[a-zA-Z0-9_]
。\W
: 匹配任何非单词字符,等价于[^a-zA-Z0-9_]
。\s
: 匹配任何空白字符(包括空格、制表符、换行符等),等价于[ \t\n\r\f\v]
。\S
: 匹配任何非空白字符,等价于[^ \t\n\r\f\v]
。
5. 锚点(Anchors)
^
: 匹配输入字符串的开始位置。- 例子:
^The
匹配以 “The” 开始的任何字符串。
- 例子:
$
: 匹配输入字符串的结束位置。- 例子:
end$
匹配以 “end” 结尾的任何字符串。
- 例子:
6. 边界匹配符(Boundaries)
\b
: 匹配单词边界。- 例子:
\bword\b
匹配独立的单词 “word”。
- 例子:
\B
: 匹配非单词边界。- 例子:
\Bend
匹配 “end” 但不是作为独立单词的 “end”。
- 例子:
7. 量词(Quantifiers)
*
: 匹配前面的元素零次或多次。- 例子:
bo*
匹配 “b” 后面跟随零个或多个 “o”。
- 例子:
+
: 匹配前面的元素一次或多次。- 例子:
bo+
匹配 “b” 后面跟随一个或多个 “o”。
- 例子:
?
: 匹配前面的元素零次或一次。- 例子:
bo?
匹配 “b” 后面跟随零个或一个 “o”。
- 例子:
{n}
: 匹配前面的元素恰好 n 次。- 例子:
bo{2}
匹配 “boo”。
- 例子:
{n,}
: 匹配前面的元素至少 n 次。- 例子:
bo{2,}
匹配 “boo”、“booo” 等。
- 例子:
{n,m}
: 匹配前面的元素至少 n 次,但不超过 m 次。- 例子:`bo{1,3
}` 匹配 “bo”、“boo”、“booo”。
8. 分组和反向引用(Grouping and Backreferences)
( )
: 创建捕获组,对于一个或多个字符进行分组。- 例子:
(ab)+
匹配 “ab”、“abab”、“ababab” 等。
- 例子:
\1
,\2
, etc: 匹配对应捕获组捕获的文本。- 例子:
(ab)\1
匹配 “abab”。
- 例子:
9. 或操作(Alternation)
|
: 匹配|
前后任一模式。- 例子:
cat|dog
匹配 “cat” 或 “dog”。
- 例子:
10. 贪婪与非贪婪匹配(Greedy vs. Non-greedy Matching)
- 贪婪量词(如
*
,+
,{n,}
): 默认情况下,量词是贪婪的,会尽可能多地匹配字符。- 例子:
a.*b
匹配从 “a” 开始到最后一个 “b” 的整个区域。
- 例子:
- 非贪婪量词(如
*?
,+?
,{n,m}?
): 匹配尽可能少的字符。- 例子:
a.*?b
匹配从 “a” 开始到第一个 “b” 的最短区域。
- 例子:
11.断言
在正则表达式中,断言用来描述一个位置,这个位置必须满足某些条件,但它不消耗任何字符。断言有几种形式,包括正向和反向的,查找(lookahead)和回顾(lookbehind):
-
正向查找(Positive Lookahead):
A(?=B)
- 这里A
是你想要匹配的表达式,但只有当它后面紧跟着表达式B
时,A
才会被匹配。匹配的结果中只包含A
部分。例如,正则表达式
\d(?=\.)
会匹配一个数字,但只有当这个数字后面紧跟着一个点号.
时。 -
反向查找(Negative Lookahead):
A(?!B)
- 这里A
是你想要匹配的表达式,但只有当它后面没有紧跟着表达式B
时,A
才会被匹配。也就是说,如果A
后面跟的是B
,则A
不会被匹配。例如,正则表达式
\d(?!.)
会匹配一个数字,但只有当这个数字后面没有紧跟着一个点号.
时。 -
正向回顾(Positive Lookbehind):
(?<=B)A
- 这里A
是你想要匹配的表达式,但只有当它前面紧跟着表达式B
时,A
才会被匹配。匹配的结果中只包含A
部分。例如,正则表达式
(?<=\$)\d+
会匹配一个或多个数字,但只有当这些数字前面紧跟着一个美元符号$
时。 -
反向回顾(Negative Lookbehind):
(?<!B)A
- 这里A
是你想要匹配的表达式,但只有当它前面没有紧跟着表达式B
时,A
才会被匹配。也就是说,如果A
前面跟的是B
,则A
不会被匹配。例如,正则表达式
(?<!\$)\d+
会匹配一个或多个数字,但只有当这些数字前面没有紧跟着一个美元符号$
时。
断言是一种零宽度匹配,这意味着它们不会匹配任何实际的字符,而只匹配一个位置。这让它们成为复杂正则表达式的重要组成部分,可以用来构建更精细的搜索模式。
习题
1. 基本匹配概念
习题:
A. 在字符串 “The quick brown fox jumps over the lazy dog” 中匹配 “quick”。
B. 匹配 “can” 在 “candy” 和 “can” 中。
C. 找出 “bat”、“ball” 和 “barn” 中的 “ba”。
答案:
A. quick
B. can
C. ba
2. 元字符(Metacharacters)
习题:
A. 匹配任何以 “c” 开头和 “t” 结尾的单词。
B. 在 “My email is gpt_4@example.com” 中匹配邮箱前的字符。
C. 在 “Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it. Did he mind? Adam Jones Jr. thinks he didn’t. In any case, this isn’t true… Well, with a probability of .9 it isn’t.” 中匹配所有包含 “.” 的缩写词。
答案:
A. c\wt
B. \S+@example.com
C. \b\w+\.\b
3. 字符类(Character Classes)
习题:
A. 从字符串 “room, broom, bloom” 中匹配所有包含 “oo” 的单词。
B. 从 “1234” 中匹配不是数字 “3” 的所有数字。
C. 在 “The cat sat on the mat.” 中匹配除了 “cat” 和 “mat” 之外的所有单词。
答案:
A. \b\w*oo\w*\b
B. [^3]
C. \b[^cm]at\b
4. 预定义字符类(Predefined Character Classes)
习题:
A. 匹配 “The year 1992” 中的所有数字。
B. 从 “He didn’t know the way to go. So, he took a map with him.” 中找出所有的空白字符。
C. 在 “Python_3.8.5 is released on 20th July 2020.” 中找出所有的非单词字符。
答案:
A. \d+
B. \s
C. \W
5. 锚点(Anchors)
习题:
A. 从 “end. friend; extend,” 中找出所有以 “end” 结尾的单词。
B. 匹配 “The end” 中的 “The”。
C. 在 “sitting at the end” 中匹配 “end”。
答案:
A. \b\w*end\b
B. ^The
C. end$
6. 边界匹配符(Boundaries)
习题:
A. 在 “This island is beautiful” 中匹配 “is” 作为独立单词。
B. 在 “ghosts in the fog” 中匹配 “st” 不作为单词边界。
C. 匹配 “I have a cat, but I like my dog better.” 中 “I” 作为单词。
答案:
A. \bis\b
B. \Bst
C. \bI\b
7. 量词(Quantifiers)
习题:
A. 在 “woooooow look at that!” 中匹配 “wooo” 及其后面的所有 “o”。
B. 在 “noooooo yes maybe no” 中匹配 “no” 后面至少跟着两个 “o”。
C. 在 “123 abc456 789” 中匹配数字,但每个数字不超过两位。
答案:
A. wo+
B. no{2,}
C. \b\d{1,2}\b
8. 分组和反向引用(Grouping and Backreferences)
习题:
A. 在 “The rain in Spain” 中匹配 “ain” 两次出现的地方。
B. 在 “Words, words, words.” 中匹配连续出现的单词。
C. 在 “He cried ‘Wow! Wow!’ when he won.” 中匹配重复的 “Wow!”。
答案:
A. `(ain
)\1B.
(\b\w+\b) \1C.
(Wow!) \1`
9. 或操作(Alternation)
习题:
A. 在 “Should I write color or colour?” 中匹配 “color” 或 “colour”。
B. 在 “He is a singer or a dancer.” 中匹配 “singer” 或 “dancer”。
C. 匹配 “cat”、“bat” 或 “rat”。
答案:
A. colou?r
B. singer|dancer
C. (cat|bat|rat)
10. 贪婪与非贪婪匹配(Greedy vs. Non-greedy Matching)
习题:
A. 在 “
My first paragraph.
My second paragraph.
” 中非贪婪地匹配第一个段落。B. 在 “12345” 中非贪婪地匹配至少一个数字。
C. 在 “Hello, my name is John Doe.” 中贪婪地匹配最长的以 “my” 开始以 “is” 结尾的字符串。
答案:
A. <p>.*?</p>
B. \d+?
C. my.*is