我在以ATG
开头,以TAG, TAA or TGA
结尾且length = 3的倍数的字符串中搜索模式。ATG
和TAG, 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中定义的三个替代方案之一:TAG
,TAA
或TGA
。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/