我在以ATG开头,以TAG, TAA or TGA结尾且length = 3的倍数的字符串中搜索模式。ATGTAG, TAA or TGA只能分别出现在开头或结尾。意思是:

ATGTTGTGATGT提取ATGTTGTGA

ATGATGTTGTGATGT提取ATGTTGTGA

目前,我正在使用正则表达式(ATG)([ATG]{3})+?(TAG|TAA|TGA)

对于ATGATGTTGTGATGT,这使我得到错误的结果ATGATGTTGTGA
我试过了:

(^ATG)(!?=.*ATG)([ATG]{3})+?(TAG|TAA|TGA)
(^ATG)(!?=(ATG)+)([ATG]{3})+?(TAG|TAA|TGA)


如何告诉它在开始时仅包含一次ATG,之后不包含任何内容?

最佳答案

您可以使用

ATG(?:(?!ATG)[ATG]{3})*?(?:TAG|TAA|TGA)


请参见regex demo

细节


ATG-一个ATG子字符串
(?:(?!ATG)[ATG]{3})*?-一个tempered greedy token匹配[ATG]字符集中不等于ATG的3个字符的任意序列(受negative lookahead (?!ATG)限制)
(?:TAG|TAA|TGA)-non-capturing group中定义的三个替代方案之一:TAGTAATGA


Java demo

String rx = "ATG(?:(?!ATG)[ATG]{3})*?(?:TAG|TAA|TGA)";
String s = "ATGTTGTGATGT, ATGATGTTGTGATGT, ATGATGTTGTGATGT";
Pattern pattern = Pattern.compile(rx);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
        System.out.println(matcher.group(0));
}


结果:

ATGTTGTGA
ATGTTGTGA
ATGTTGTGA

关于java - 正则表达式以“ATG”开头,以“TAG,TAA或TGA”结尾,但在两者之间不包含“ATG”和“TAG,TAA或TGA”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48042548/

10-09 16:37