需要一些帮助在Java中构建一个正则表达式

时间:2016-02-16 00:33:17

标签: regex

我正在制作一个工具来寻找氨基酸的开放阅读框作为个人项目。我有很多字符串,其中的字符由26个大写英文字母(A到Z)组成。它们看起来像这样:

GMGMGRZMQGGRZR

我希望找到字母MZ之间的所有可能匹配,以及其他一些规则。

  1. ZM之间不应该有ZEMAZAZ
    • 示例:如果MAZ是输入字符串,那么MAZAZ应该匹配,M不应该
  2. MZ之间可以有多个GMGMGRZMQGGRZRMGMGRZ
    • 示例:如果输入字符串为MGRZ,则M应该匹配,但M不应该匹配,因为之前还有MGRZGMGMGRZMQGGRZR MGMGRZ中可用于匹配的第一个MQGGRZ
  3. 例如

    使用上述字符串(MGMGRZMQGGRZ),只有MGRZMGRZAMQGGRZ匹配。 <{1}},M((?!(Z)))*Z MGMGRZ不应匹配。

    有谁知道如何构建这样的正则表达式?我查阅了一些Java正则表达式教程(我使用Java编写这个程序),但无法提出遵循上述所有规则的正则表达式。

    我得到的最接近的是这个正则表达式:

    MQGGRZ

    它表明子字符串MGRZMGRZ和{{1}}匹配。但是,我不希望{{1}}匹配。

1 个答案:

答案 0 :(得分:1)

你想要的是:

(M[^Z]+Z)

DEMO

正则表达式的工作原理如下:它会尝试匹配M,然后匹配任意数量的非ZZ的字符

问题是每个char只从左到右消耗一次,所以在

GMGMGRZMQGGRZR
 ^----^         1st match MGMGRZ
       ^----^   2nd match MQGGRZ

因此,如果您将其单独提供给正则表达式,它将匹配MGRZ