JAVA: mit Regex Motif in String Sequenz finden

Hallo zusammne,

ich bin JAVA Anfänger und experimentiere gerade mit dem regex package und Pattern und Matcher um eine Motif in einer String Sequenz zu finden:
z.B „AA“ in „AAABBAAC“ also 1. „(AA)ABBAAC“ und 2. „A(AA)BBAAC“ und 3. „AAABB(AA)C“

Leider gelingt es mir zur Zeit nur zwei der drei motife zu finden (1. und 3.)

Was muss ich tun damit ich auch dies lösung 2. finde?

Vielen Danke im voraus für jede Hilfe…

Schöne Grüsse!

Hallo!

Was heißt denn „Motif“? Kenn’ ich nur als Name für eine uralte GUI-Lib.

z.B „AA“ in „AAABBAAC“ also 1. „(AA)ABBAAC“ und 2.
„A(AA)BBAAC“ und 3. „AAABB(AA)C“

Leider gelingt es mir zur Zeit nur zwei der drei motife zu
finden (1. und 3.)

Warum, ist klar? Wenn das erste „AA“ erkannt wurde, geht die Suche hinter dem Erkannten weiter, also mit dem dritten „A“.

Lösung (eine zumindest): Ein Lookahead , ein Vorausschauen, ohne dass die Zeichen „konsumiert“ werden. Der Regexp lautet dann „A(?=A)“.

Gruß, Jan

Hallo und Danke für die Hilfe…

Was heißt denn „Motif“? Kenn’ ich nur als Name für eine uralte
GUI-Lib.

z.B „AA“ in „AAABBAAC“ also 1. „(AA)ABBAAC“ und 2.
„A(AA)BBAAC“ und 3. „AAABB(AA)C“

Dass Motif heisst in der Bioinformatik die zu suchende RegEx innerhalb z.B. einer DNA oder Protein Sequenz (AAGCCTTAA oder MNAFVGK als String)

Leider kann ich keine Regex mit lookahead benutzen.

Bis jetzt hab ich es so probiert:

_public class TEST {
public static void main(String[] args) {
Pattern p = Pattern.compile(„AA“);
Matcher m = p.matcher(„AAABBAAC“);

int i=0;

while (m.find(i++)) {
System.out.println(„Position " + m.start() + " :“ + m.group() );
}
}
}_

Leider liefert das das letzte gefundene passende Motif mehrmals:

run:
Position 0 :AA
Position 1 :AA
Position 5 :AA
Position 5 :AA
Position 5 :AA
Position 5 :AA
BUILD SUCCESSFUL (total time: 2 seconds)

Ich denke weil der matcher jedes mal neu gemacht wird…

Komme so leider nicht weiter…

Hallo!

Leider kann ich keine Regex mit lookahead benutzen.

Wieso nicht?

Bis jetzt hab ich es so probiert:

_public class TEST {
public static void main(String[] args) {
Pattern p = Pattern.compile(„AA“);
Matcher m = p.matcher(„AAABBAAC“);

int i=0;

while (m.find(i++)) {
System.out.println("Position " + m.start() + "

" + m.group() );

}
}
}_

Leider liefert das das letzte gefundene passende Motif
mehrmals:

Du verschiebst ja immer auch nur um eine Position und suchst nacheinander in
„AAABBAAC“ nochmal gefunden
„BAAC“ nochmal gefunden
„AAC“ nochmal gefunden

Mach mal (ungetestet):

 int pos=0;

 while (m.find(pos)) {
 System.out.println("Position " + m.start() + ":" + m.group() );
 pos = m.start()+1;
 }
 }

Jan

Hallo!

Leider kann ich keine Regex mit lookahead benutzen.

Wieso nicht?

Weil ich die Regex von einer anderen Methoden übernehme und die leider nur Regex ohne lookahead ausgibt.

Hallo Ronny

Leider kann ich keine Regex mit lookahead benutzen.

Wieso nicht?

Weil ich die Regex von einer anderen Methoden übernehme und
die leider nur Regex ohne lookahead ausgibt.

Kannst Du den Regex nicht ‚on the fly‘ modifizieren?

Ich hab mal versucht (Da ich auch mal Java lernen möchte),
das zu vergleichen. Je nach Komplexität kann es schon
zwingend notwendig werden, lookarounds zu verwenden.

Ist die Problemstellung trivial, braucht man das nicht,
JayVee hat das ja schon gezeigt.

Beispiel:
(Aufruf mit dateiname.seq)

package regmotif;
import java.io.\*;
import java.util.regex.\*;

public class Main {
 public static void main(String[] args) {
 String content = "";
 try {
 content = slurp( args[0] );
 } catch(Exception e) {}
 System.out.print(content);

 System.out.println("looking for AA - pos\_scan()");
 String h1 = pos\_scan("AA", content);
 System.out.print(h1);

 System.out.println("looking for (A(?

Grüße

CMБ