Problem z wyrażeniem regularnym

Problem z wyrażeniem regularnym
XA
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:18
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:

Kopiuj
.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:

Kopiuj
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.

__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
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 ":".

Kopiuj
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]));
        }
    }
}

Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 2x, ostatnio: __krzysiek85
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

AR
No co ty! zawsze jeszcze można to rozrysować w UMLu. Wtedy masz już trzy problemy :D
XA
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:18
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.