更好地用例子解释:
我需要提出一个仅匹配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已经在一个组中了。
答案 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,所以不需要重复那个片段。