正则表达式匹配模式一次或多次,没有部分匹配

时间:2012-07-28 15:52:17

标签: regex grep

更好地用例子解释:

  1. HHH
  2. HHHH
  3. HHHBBHHH
  4. HHHBH
  5. BB
  6. HHBH
  7. 我需要提出一个仅匹配3个H或3个H的倍数的正则表达式(所以6,9,12,...... H也可以)并且5个H 好的如果可能的话,我不想使用Perl regexps。

    因此,对于上面的输入,正则表达式仅匹配(1),(3)和(6)。 我刚开始使用正则表达式,所以我不知道我应该如何处理这个问题。

    修改 只是为了澄清一些事情:一个H只能在一组3个H中。 3 H组可能是HHH或HHBH。 这就是为什么在上面的例子2中它不匹配,因为最后的H不在3 H的组中。并且你不能把最后3个H作为一个组,因为中间的2个H已经在一个组中了。

3 个答案:

答案 0 :(得分: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]*H三次,我们确保确实包含了3个H[^H]*允许任何分隔字符。

注意:使用egrep或使用附加参数-E运行grep。

答案 1 :(得分:2)

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

(H{3})+

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

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

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

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

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

答案 2 :(得分: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,所以不需要重复那个片段。