RegEx: mehrere Treffer pro Zeile

Wurzelseppi

Mitglied
Hallo zusammen,

sorry, steht bestimmt irgendwo, ich habs aber nicht gefunden.

Möchte mit einem Pattern : .*(@.*@).* ... ALLE @xx@ in einer Zeile durch bestimmte Werte ersetzen.

Allerdings findet der Matcher immer nur die letzte Stelle in einer Zeile:

z.B

Ich heisse @property.name@ und bin @property.age@ Jahre alt.

soll werden zu

Ich heisse Wurzelseppi und bin 27 Jahre alt

werden.

allerdings findet er wenn ich als Pattern : .*(@.*@).* angebe immer nur @property.age@ ....

Weis jemand Rat?

Danke.

Gruß,

Wurzelseppi
 
Hallo Wurzelseppi

ich bin kein RegEx-Experte, aber ich würde es eher mit folgendem versuchen: (@[^@]+@)

hoffe das hilft dir weiter.

Gruß
Herbert
 
Herbert hat recht, da .* "gierig" ist und alle Zeichen für sich beansprucht bis es KEINE Ünereinstimmung mehr mit dem Endmuster gibt, dann wird per Backtracking die letzte Übereinstimmung genommen und zurückgegeben.

[^@]+ ist NICHT gierig und sollte somit das gewünschte Ergebnis liefern.
 
hi,
soetwas in der Art habe ich vor gar nicht allzulanger Zeit auch gemacht.
Ich kann zwar für meine Lösung nicht 100% garantieren aber ich habe folgende
pattern verwendet.
"@[^@ ]+@|\\s@+\\w+\\s|\\s\\w+@+\\s|\\s@+\\s"
kannst ja mal ausprobieren und erzählen in wie weit sie gut ist und in wie weit sie nicht so gur ist.

in diesem Sinne Takidoso

Nachtrag: Ich muss dazu sagen, dass ich die Pattern nur verwendet habe um nachzuschauen, ob irgend eine Austauschkonstante vergessen wurde zu definieren.
Java:
    /**
     * replaces a configFile's constants that are marked by embracing "at-symbols" (@my_constant@)
     * those constants are given via properties.
     *
     * @param configFile  file that is to be preprocessed
     * @param constants constatns that are to be replaced in the configFile by their values
     * @return String with the preprocessd configFile content
     * @throws FileNotFoundException
     * @throws IOException
     */
    private String preprocessConfig(File configFile, Properties constants) throws FileNotFoundException, IOException
    {
        BufferedReader bufReader = new BufferedReader(new FileReader(configFile));
        String bufStr;
        StringBuffer configBuf = new StringBuffer(150000);
        while ((bufStr = bufReader.readLine())!=null)
        {
            configBuf.append(bufStr).append("\n");
        }

        Set<Map.Entry<Object,Object>> constantSet = constants.entrySet();

        bufStr = configBuf.toString();

        for (Entry constant : constantSet)
        {
            bufStr = bufStr.replaceAll("@"+(String)constant.getKey()+"@",((String) constant.getValue()).trim()); //trim is just for making sure if the application to be called does not care
        }

        // check if all used preyaml-properties were defined
        Pattern pattern = Pattern.compile("@[^@ ]+@|\\s@+\\w+\\s|\\s\\w+@+\\s|\\s@+\\s");
        Matcher matcher = pattern.matcher(bufStr);
        Map<String,Integer> undefinedConstMap = new HashMap<String,Integer>();
        while (matcher.find())
        {
        	String token = matcher.group(); 
            Integer counter = undefinedConstMap.get(token);
            int x = counter==null ? 1 : counter+1;
            undefinedConstMap.put(token, x);
        }
        
        if (undefinedConstMap.size()>0)
        {
        	StringBuffer strBuf = new StringBuffer(1024);
        	strBuf.append("undefined preprocessing constants were used in config file.\n");
        	Set<Map.Entry<String,Integer>> entrySet = undefinedConstMap.entrySet();
        	for (Map.Entry<String, Integer> undefConst : entrySet)
        	{
        		strBuf.append(undefConst.getKey()).append(" ").append(undefConst.getValue()).append(" times\n");
        	}
        	strBuf.append("please enhance properties for preprocessing or correct config file!");
        	
        	throw new ConfigurationException(strBuf.toString());
        }
        
        return bufStr;
    }
 
Zuletzt bearbeitet:
Hallo zusammen,

kleiner Tipp am Rande in diesem Zusammenhang!

Wir nutzen hier in der Firma zum Testen von regulären Ausdrücken das nette kleine Tool "RegEx coach"!

Es kann (zusammen mit seiner Doku) hier runtergeladen werden:
http://weitz.de/files/regex-coach.exe (Windows installer)
oder http://weitz.de/files/regex-coach.tgz (Linux tar archive)

Es eignet sich auch gut zur Einarbeitung in dieses Thema und man kann in dem Editor verschiedenen reguläre Ausdrücke testen!

Gruß
Klaus
 
Hi zusammen,

danke für die vielen Antworten.
Habe mich gestern, weil ich mich nicht allzulange damit aufhalten wollte, mit einem Workaround mit apache.commons.lang.StringUtils.stringsBetween(..) beholfen. Funktioniert einwandfrei, aber ich denke, ich werd das mit den Regulären Ausdrücken auch nochmal testen.

Danke vielmals .... ist immer wieder eine Freude sich hier im Forum zu tummeln....

Gruß,

Wurzelseppi
 
Zuletzt bearbeitet:
Zurück