Problem z wyrażeniem regularnym

0

Witam,
nie potrafię napisać regexa. Mam takiego stringa:
nazwa_pliku_1.png:int|nazwa_pliku_2.png:int itd.
Mam już regexa, który wyciąga nazwy plików do tablicy:

.replaceAll(":\\d+", "").split("\\|")

Nie potrafię natomiast wyciągnąć tych liczb (też do tablicy).

0

Zakladam ze plik i ten int jest w jakis sposob powiazany? Wiec moze cos takiego:

import java.util.*;


class Test {
    public static void main(String[] args) {
        String line = "nazwa_pliku_1.png:17|nazwa_pliku_2.png:21";
        List<String[]> items = new ArrayList<String[]>();
        String[] tokens = line.split(":|\\|");
        for (int i = 0; i < tokens.length; i += 2) {
            String file = tokens[i];
            String int_ = tokens[i + 1];
            items.add(new String[] { file, int_ });
        }
        for (String[] item : items) {
            System.out.println(String.format("file: %s, int: %s", item[0], item[1]));
        }
    }
}

Ten regex brzmi: dwukropek lub pipe, przy czym pierwszy pipe to regexowy OR, a drugi chcemy traktowac doslownie, dlatego musi byc escape. Dodatkowo, jeden bashslash nie wystarczy jako ze stringi w javie uzywaja backslashy do swoich escape sequence, a | jest niepoprawne, i trzeba samego backslasha escapowac.

0

Alternatywnie można skorzystać z grup.
http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html (Groups and capturing)
Pierwsza grupa składa się z dowolnych znaków oprócz ":" i "|".
Druga grupa składa się z cyfr.
Pomiędzy tymi grupami musi być znak ":".

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Test {
    private static final Pattern pattern = Pattern.compile("([^:|]+):(\\d+)");
	
    public static void main(String[] args) {
        String line = "nazwa_pliku_1.png:17|nazwa_pliku_2.png:21";
        List<String[]> items = new ArrayList<String[]>();
        Matcher matcher = pattern.matcher(line);
        while (matcher.find()){
        	items.add(new String[] { matcher.group(1),  matcher.group(2) });
        }
        for (String[] item : items) {
            System.out.println(String.format("file: %s, int: %s", item[0], item[1]));
        }
    }
}
0

Prawda, ale specjalnie zrobilem tak prosto. Ten Twoj regex to juz taki maly hardcorek, szczegolnie dla kogos kto raczkuje w regexach. Ciekawe co jest szybsze?
A najlepsze moim zdaniem i tak w tej sytuacji jest przelecenie stringa i wycinanie go z palca... Mowi sie "masz problem i probujesz zalatwic go regexami - teraz masz 2 problemy" :D

0

Dzięki
Przetestowałem, ten drugi sposób jest ponad 2 razy szybszy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1