2017-12-31 144 views
1

Ich suche nach Mustern in einem String beginnend mit ATG, endend mit und Länge = Vielfaches von 3. ATG und TAG, TAA or TGA können nur am jeweiligen Anfang oder Ende erscheinen. Das heißt:Regex beginnt mit "ATG" endet mit "TAG, TAA oder TGA" aber enthält nicht "ATG" und "TAG, TAA oder TGA" zwischen

Von ATGTTGTGATGT Extrakt ATGTTGTGA

Von ATGATGTTGTGATGT Extrakt ATGTTGTGA

Derzeit regex (ATG)([ATG]{3})+?(TAG|TAA|TGA) Ich verwende.

Für ATGATGTTGTGATGT dies bringt mir das falsche Ergebnis ATGATGTTGTGA. Ich habe versucht:

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

Wie es sagen ATG nur einmal am Anfang enthalten und nicht mehr danach?

+2

Ihr erstes Beispiel scheint nicht Ihre Beschreibung passen: es funktioniert nicht mit TAG Ende | TAA | TGA? – Ward

+0

Dies ist mit regexp nicht möglich. Sie können eine * negative Suche * durchführen, wenn 'ATG' nicht zuerst oder zuletzt ist und * dieses Ergebnis negiert *. –

+1

Probieren Sie ['ATG (?: (?! ATG) [ATG] {3}) *? (?: TAG | TAA | TGA)'] (https://regex101.com/r/GCdGs8/1) –

Antwort

2

können Sie verwenden

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

Siehe regex demo

Einzelheiten

  • ATG - eine ATG Teilzeichenfolge
  • (?:(?!ATG)[ATG]{3})*? - eine tempered greedy token eine beliebige Folge von 3 char passende s aus dem [ATG] Zeichensatz, der nicht gleich ATG ist (das mit der negative lookahead beschränkt (?!ATG))
  • (?:TAG|TAA|TGA) - eine der drei Alternativen definiert im non-capturing group: TAG, TAA oder 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)); 
} 

Ergebnis:

ATGTTGTGA 
ATGTTGTGA 
ATGTTGTGA 
Verwandte Themen