正则表达式梳理大全

本文详细介绍了正则表达式的各种核心概念,包括基本匹配、元字符、字符类、预定义字符类、锚点、边界匹配、量词、分组、反向引用、或操作、贪婪与非贪婪匹配,并通过习题形式展示了如何应用这些概念。
摘要由CSDN通过智能技术生成

正则表达式的概念可以分为几个大类,每个大类下有不同的特定元素。以下是这些概念的概述,包括预定义字符类的特定含义和每个大类的示例:

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):

  1. 正向查找(Positive Lookahead): A(?=B) - 这里 A 是你想要匹配的表达式,但只有当它后面紧跟着表达式 B 时,A 才会被匹配。匹配的结果中只包含 A 部分。

    例如,正则表达式 \d(?=\.) 会匹配一个数字,但只有当这个数字后面紧跟着一个点号 . 时。

  2. 反向查找(Negative Lookahead): A(?!B) - 这里 A 是你想要匹配的表达式,但只有当它后面没有紧跟着表达式 B 时,A 才会被匹配。也就是说,如果 A 后面跟的是 B,则 A 不会被匹配。

    例如,正则表达式 \d(?!.) 会匹配一个数字,但只有当这个数字后面没有紧跟着一个点号 . 时。

  3. 正向回顾(Positive Lookbehind): (?<=B)A - 这里 A 是你想要匹配的表达式,但只有当它前面紧跟着表达式 B 时,A 才会被匹配。匹配的结果中只包含 A 部分。

    例如,正则表达式 (?<=\$)\d+ 会匹配一个或多个数字,但只有当这些数字前面紧跟着一个美元符号 $ 时。

  4. 反向回顾(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值