Problem z wyrażeniem regularnym

Odpowiedz Nowy wątek
2011-07-07 19:57
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).

Pozostało 580 znaków

2011-07-07 23:28
::.
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.

Pozostało 580 znaków

2011-07-07 23:47
0

Alternatywnie można skorzystać z grup.
http://download.oracle.com/ja[...]/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]));
        }
    }
}

Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 2x, ostatnio: __krzysiek85, 2011-07-07 23:50

Pozostało 580 znaków

2011-07-07 23:54
::.
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

No co ty! zawsze jeszcze można to rozrysować w UMLu. Wtedy masz już trzy problemy :D - areksum 2011-07-08 00:23

Pozostało 580 znaków

2011-07-15 13:53
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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