# Teil aus einem String extrahieren?



## JavaUncle (9. Mai 2008)

Hallo

ich habe einen String, der z.B. so aussieht:


```
String testStr = "Hier steht irgend ein 003 text25 der1 nicht0 relevant ist aber $_VAR005 ist interessant und die 005 will ich haben!";
String[] match = testStr.split("\\$_VAR[0-9]{0,3}");
```

in match steht mein testStr als String[] Array, die einzelnen Elemente enthalten jeweils 1 Char aus meinem String.

Irgend etwas stimmt da nicht... ich brauche die dreistellige Zahl nach $_VAR (und nur diese!), wobei diese aber auch ein oder zweistellig sein kann.

Erkennt hier jemand was da faul ist? Stimmt mit meiner RegExp irgend etwas nicht, oder ist split() nicht mein Kandidat?

Gruß
JavaUncle


----------



## Thomas Darimont (9. Mai 2008)

Hallo,

schau mal hier:

```
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 *
 */
public class RegexTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String testStr = "Hier steht irgend ein 003 text25 der1 nicht0 relevant ist aber $_VAR005 ist interessant und die 005 will ich haben!";
        System.out.println(testStr.replaceAll(".*\\$_VAR(\\d{3}).*", "$1"));
    }

}
```

Gruß Tom


----------



## Hardi82 (9. Oktober 2008)

Ich habe auch ein Regexp-Problemchen. Und zwar habe ich folgendes String:

1 ...
2 ' hier ist ein Komentar
3 ...
4 <codeschnippsel> 'hier ist ein Kommentar am Zeilenende
5 ...
6 <code String("hier steht ein 'Text' der zum Code gehört")>
7 ...
8 ' noch ein Kommentar

So, nun möchte ich mir nur die Kommentare anzeigen lassen. Also nur Zeile 2, letzen Teil von 4 und Zeile 8. Ausgeschlossen soll der Bereich im String sein, der mit ' eingeschlossen ist.

Meine Ansätze sahen wie folgt aus: 
1) .*'.*  <- ohne DOTALL zeigt dieses die gesamte Zeile an
2) '.*    <- ohne DOTALL zeigt dieses zwar das Kommentar an, aber es wird auch Zeile 6 mit einbezogen

Nun fehlt noch das Extrahieren von Zeile 6 und an diesem Punkt komme ich nicht weiter. Hat da jemand eine Lösung bzw. ein Tipp?

Grüße
Hardie


----------



## joschi70 (9. Oktober 2008)

Hi Hardie,

auf die Schnelle würde ich das so machen:


```
Pattern pattern = Pattern.compile("'.*");
Matcher matcher = pattern.matcher(code.replaceAll("\".*?\"", ""));
  	    
 while (matcher.find()) {
  	 System.out.println(matcher.group(0));   
}
```

Gruß
joschi


----------



## Hardi82 (10. Oktober 2008)

So funktioniert es wie gewünscht. Dass ich da nicht selbst drauf gekommen bin.....Nun habe ich noch eine andere Sache. Und zwar möchte ich folgenden String validieren:

'------------------------------------------------------------------------------
'NAME:          nicht_valutierte_Passiva
'PURPOSE:       Provides data for audit trail functionality
'
'REVISIONS:
'   Ver        Date      Author           Description
'   ---------  --------  ---------------  -------------------------------------
'   1.0        20061218  Peter Schmidt    Commented this procedure.
'
'NOTES:
'   Each CRDB table contains the administrative fields
'   - [InsertTimestamp], [InsertUser] for information about record creation and
'   - [UpdateTimestamp], [UpdateUser] for information about record modification
'   These fields are filled by SetAdminInfo usually when a record is stored.
'
'------------------------------------------------------------------------------

Mein Ansatz war folgender: 

```
^'-+([\r\n]{1,2})'NAME:([ \t]*)[\w\d]+\1'PURPOSE:\2([\w\d \t])+\1'\1'REVISIONS:\1'\2...etc
```

Leider scheitert diese Suche bei mir, wenn ich "\2" verwende. Setze ich dagegen den Inhalt aus dem zweiten Klammernpaar direkt an die Stellen ein, funktioniert die Sache. Mit "\1" habe ich dagegen keine Probleme. Laut Tutorials sind doch die offenen Klammern zu zählen, um auf die Zahl zu kommen, oder übersehe ich da was?


----------

