Java 中的量词

10 Sept 2024 | 4 分钟阅读

在 Java 中,正则表达式经常用于定义字符序列的搜索模式。量词,用于确定字符或字符组的出现次数,是指定搜索范围不可或缺的一部分。这些表达式有助于定义给定文本或数据中模式匹配的规则。

  1. X* (零次或多次出现)
    • 该量词指定元素 X 在给定字符串中可以出现零次或多次。
    • 示例:如果 X 是字符 'a',则模式 "a*" 将匹配空字符串、"a"、"aa"、"aaa" 等。
  2. X? (零次或一次出现)
    • 该量词表示元素 X 在给定字符串中可以出现零次或一次。
    • 示例:如果 X 是字符 'b',则模式 "b?" 将匹配空字符串或 "b"。
  3. X+ (一次或多次出现)
    • 该量词指定元素 X 在给定字符串中至少出现一次,但也可以出现多次。
    • 示例:如果 X 是字符 'c',则模式 "c+" 将匹配 "c"、"cc"、"ccc" 等。
  4. X{n} (正好出现 n 次)
    • 该量词要求元素 X 在给定字符串中正好出现 n 次。
    • 示例:如果 X 是字符 'd',则模式 "d{3}" 将匹配 "ddd"。
  5. X{n,} (至少出现 n 次)
    • 该量词指定元素 X 在给定字符串中至少出现 n 次,但也可以出现更多次。
    • 示例:如果 X 是字符 'e',则模式 "e{2,}" 将匹配 "ee"、"eee" 等。
  6. X{n, m} (出现 n 到 m 次之间)
    • 该量词定义了一个范围,指出元素 X 在给定字符串中必须出现 nm 次之间。
    • 示例:如果 X 是字符 'f',则模式 "f{2,4}" 将匹配 "ff"、"fff" 或 "ffff",但不匹配 "f" 或 "fffff"。

贪婪量词 (默认)

贪婪量词是正则表达式的默认行为,它在允许整个模式匹配的情况下,尽可能多地匹配输入。换句话说,它试图消耗尽可能多的字符并满足整个正则表达式。

算法

步骤 1: 设置要搜索的输入字符串,例如 "abc123def456"。

步骤 2: 使用 Pattern 类和数字的贪婪量词定义模式,即 "\\d+"。

步骤 3: 使用输入字符串和定义的贪婪模式创建 Matcher 对象。

步骤 4: 循环遍历输入字符串以查找并打印匹配项。

  • 在每次迭代中查找输入字符串中最长的数字序列。

步骤 5: 打印匹配的组。

实施

文件名: GreedyQuantifierExample.java

输出

Match: 123
Match: 456

勉强量词 (在量词后附加 ?)

Java 正则表达式中的勉强量词,也称为非贪婪或懒惰量词,会尽可能少地匹配,这与贪婪量词相反。它们最初匹配第一个字符,并在需要时从输入字符串中添加更多字符。在贪婪量词后附加 "?" 可将其转换为勉强量词。它在文本处理任务中对于提取最短的匹配序列非常有用。

算法

步骤 1: 设置要搜索的输入字符串,例如 "abc123def456"。

步骤 2: 使用 Pattern 类和数字的勉强量词创建模式,例如 "\\d+?"。

步骤 3: 使用输入字符串和勉强模式创建 Matcher 对象。

步骤 4: 进入一个循环,使用匹配器在输入字符串中查找并打印匹配项。

  • 在每次迭代中,查找输入字符串中的下一个匹配项。

步骤 5: 显示匹配的组。

实施

文件名: ReluctantQuantifierExample.java

输出

Match: 1
Match: 2
Match: 3
Match: 4
Match: 5
Match: 6

占有量词 (在量词后附加 +)

Java 正则表达式中的占有量词通过在常规量词后附加加号 + 来表示。该量词类似于贪婪量词,但行为有所不同。占有量词会尽可能多地匹配,并且不会回溯,即使这样做可以使整个模式匹配。

算法

步骤 1: 设置要搜索的输入字符串,例如 "abcccc"。

步骤 2: 使用 Pattern 类和占有量词创建模式,例如 "c++"。

步骤 3: 使用输入字符串和占有模式创建 Matcher 对象。

步骤 4: 进入一个循环,使用匹配器在输入字符串中查找并打印匹配项。

  • 在每次迭代中,查找输入字符串中的下一个匹配项。

步骤 5: 显示匹配的组。

实施

文件名: PossessiveQuantifierExample.java

输出

Match: cccc