3

用例子更好地解释:

  1. HHH
  2. 呼呼呼
  3. 哈哈哈哈哈
  4. HHHHH
  5. BB
  6. HHBH

我需要想出一个只匹配 3 个 H 或 3 个 H 的倍数的正则表达式(所以 6、9、12、... H 也可以),而 5 个 H不行。如果可能的话,我不想使用 Perl 正则表达式。

因此,对于上面的输入,正则表达式将仅匹配 (1)、(3) 和 (6)。我只是从这里的正则表达式开始,所以我不完全知道我应该如何处理这个问题。

编辑 只是为了澄清一些事情:一个H只能在一组3个H中。3 个 H 的组可能是 HHH 或 HHBH。这就是为什么在上面的示例 2 中它不匹配,因为最后一个 H 不在一组 3 个 H 中。而且你不能取组中的最后 3 个 H,因为中间的 2 个 H 之前已经在一个组中。

4

3 回答 3

3

您可以使用以下正则表达式:

^([^H]*H[^H]*H[^H]*H[^H]*)+$

它匹配任何总共包含 3 个 H 或 3 的任何倍数的字符串。中间可能有任何其他字符。

解释:

^              begin of string
(              start of group
  [^H]*H       any string of characters (or none) not including 'H' plus a single 'H'
  [^H]*H       any string of characters (or none) not including 'H' plus a single 'H'
  [^H]*H       any string of characters (or none) not including 'H' plus a single 'H'
  [^H]*        any string of characters (or none) which is not 'H'
)+             containing the group once or twice or ...
$              end of string

通过重复子模式[^H]*H3 次,我们确保确实包含 3 个H[^H]*允许任何分隔字符。

注意:使用其中egrep之一或运行带有附加参数的 grep -E

于 2012-07-28T15:57:19.290 回答
2

假设 H 可以与非 H 任意交错,但 H 的总数必须是 3 的非零倍数(因此 XXX,不包含 H,不匹配),则总正则表达式为任何事情都不是微不足道的。这不是初学者的正则表达式。

我将假设正则表达式的方言将{}()视为用于计数和分组的元字符,并包含+一个或多个。如果您正在使用具有不同要求的正则表达式系统(\{\}例如),请相应地进行调整。

您需要正则表达式来匹配整个字符串,因此不允许出现杂散 H。因此,它必须以 开头^和结尾$。您需要在前后允许任意数量的非 H。H 可以由任意数量的非 H 分隔。这导致:

^([^H]*H[^H]*H[^H]*H)+[^H]*$

哎哟; 这很难读!它表示该行必须由 1 个或多个 ( +) 组任意数量的非 H 后跟一个 H、任意数量的非 H、另一个 H、任意数量的非 H 和第三个 H 组成;所有这些都可以后跟任意数量的非H。

使用{}计数:

^(([^H]*H){3})+[^H]*$

这仍然很难阅读。请注意,我的描述是“前后任意数量的非 H”,但我只[^H]*在后面使用;这是因为重复模式允许任意数量的非 H 出现在前面,因此无需重复该片段。

于 2012-07-28T16:17:36.447 回答
2

使用它来匹配 3 个 H 的倍数:

(H{3})+

这是您示例的完整正则表达式:

^(H{3})+B*(H{3})*$

编辑:看起来你需要计算非连续的 H。在这种情况下:

^(([^H]*H){3})+[^H]*$

这应该匹配任何具有 3 个 H 倍数的字符串。

于 2012-07-28T15:54:45.203 回答