problem z wyrażeniami regularnymi

0

Witam

Mam problem z wyrażeniami regularnymi w javie, chcę aby w odpowiednich polach tekstowych można było wpisywqać tylko okreslone wartości np w polu NIP tylko liczby i ewnetualnie "-", pole imie tylko litery itd. Klasa, która jest za to odpowiedzialna wygląda następująco:

import java.util.regex.*;
import javax.swing.JTextField;

public class Validation
{
public static boolean test(JTextField source, String regex)
{
try
{
Pattern pat = Pattern.compile(regex);
Matcher mat = pat.matcher(source.getText());

		return mat.matches();
		
		//ewentualnie return Pattern.matches(regex, source.getText()); ale to też nie działa
	}
	catch (PatternSyntaxException e)
	{
		e.printStackTrace();
		return false;
	}
}

}

Kiedy wywołuje tą metodę

if (Validation.test(nip, "[0-9]"))
{
System.out.print("OK");
}
else
{
JOptionPane.showMessageDialog(null, "Błąd");
}

Zawsze wyskakuje pierwsza opcja czyli OK, niezaleznie od tego czy w polu tekstowym o nazwie nip wpiszę cyfry czy litery. Nie mam pojęcia dlaczego tak sie dzieje. Jeśli ktoś wie w czym rzecz prosze o pomoc. Dzieki

Pozdrawiam

0

Już wiem dlaczego, wpisywałem ciąg znaków a warunek który stworzyłem działa tlko dla pojedynczego znaku

0

ano - zabrakło Ci gwiazdki, plusa, albo jeszcze lepiej (dla NIPu) - {10,10}

//{x,x} == {x} - M

0

Możesz wyjaśnić co to jest {10, 10} bo ja z wyrażeniami regularnymi nie bardzo. Dzięki

0

x{a,b} - co najmniej a, maksymalnie b powtórzeń wyrażenia x.
następnym razem użyj google, to nie boli.

0

W wypadku nipu szybciej chyba by sie spisywalo to:

public static boolean isNumeric(String s, int count) {
if (s.length() != count) return false;
for (int i = 0; i < count; ++i) {
if (!Character.isDigit(s.charAt(i)) return false;
}
return true;
}

Nie zawsze warto uzywac regexow, sa dosc wolne.

0

@pikseloza, twoja funkcja isNumeric() jest zbyt rygorystyczna.
Nip sprawia trochę kłopotów, nie można zabronić wpisania takiego numeru 123-456-789. I taki numer trzeba zapisać w bazie. Inny użytkownik programu pytany o nip może wpisać 12-345-6789 lub 123456789. To jest ten sam numer i trzeba go znaleźć. Jedno z rozwiązań, to pamiętać dwie postacie numeru. Drukować (wyświetlać) tę z separatorami, przy zapytaniach korzystać ze skróconej - tylko cyfry.

0

@up
zgadza sie, ale ja tylko podalem przyklad ktory robi to samo co regex z postu powyzej, ktory rowniez pozwala na tylko same cyfry

0

do walidacji ręcznie wpisanego NIPu nie potrzebujesz jakiejś ekspresowej szybkości, a dorzucenie myślnika do regexpa to dwa znaki więcej: [0-9-]{10,14}

0

Sproboj "[0-9]-?([0-9]-?){8,8}[0-9]$" . Wyrazenie w tym przykladzie musi miec 10 cyfr, zaczynac [0-9] i konczyc [0-9]$ sie cyfra. W srodku jest 8 cyfr ([0-9]-?){8,8} . po wszystkich cyfrach moze wystepowac maxymalnie jeden myslnik - (oprocz ostatniej). 1-2-3-4-5-6-7-8-9-0 , 1234567890 czy 123-456-789-0 beda rozpoznawane,ale nie 1234567890- , -1234567890 czy 1234--567890

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