Wyrazenie regularne 'nie zaczynaj sie od __' (dwa podkreslniki)

0

Mam takie oto wyrazenie do napisania, z ktorym sobie poradzilem ale czuje ze mozna lepiej:
wyraz nie moze zaczynac sie cyfra ani __ (podwojny podkreslnik), dozwolone male / wielki litery, # oraz $, ma to byc w XSD w znaczniku <pattern> w <restriction> (czyli nie ma np lookahead / lookbehind itp).

Mam takie cos:

|[a-zA-Z#$0-9][_a-zA-Z#$0-9]|[a-zA-Z#$][_a-zA-Z#$0-9]

(trzy 'lub') co mnie troche przeraza. Da sie to (chyba bez straty dokladnosci?) zamienic na nieco krotsze:

|([a-zA-Z#$0-9]|[a-zA-Z#$])[_a-zA-Z#$0-9]*

(2 'lub', z czego drugie ma tez 2 'lub'). Zdaje sie dzialac dla moich testow:

poprawne:
a, ab, a1, _a1af, _1fad334$#$#FS, $aFfsfsFES42$#, #a43sFS3##, $1$$$$####$$$$, #1, #####, $$$$$$$$$, #$#$#$#$#$#, a, a_b, a, a__b, _1, _#, _, _a__b

niepoprawne:
a.b, 1, 12, 1ab, 1v2, one,two three!four&five, __id, __, __w_h_a_t_e_v_e_r

Mam jednak wrazenie ze ten regex da sie duzo latwiej i czytelniej napisac. Czy ktos potrafi pomoc?

Pozdrawiam.

0
/(_[\w#\$\d])|[\w\$#][_\w\d#\$]*/i

Chyba powinno zadziałać.

0
winerfresh napisał(a)
/(_[\w#\$\d])|[\w\$#][_\w\d#\$]*/i

Chyba powinno zadziałać.

Chyba nie, wydaje mi sie ze np. '_9d' nie przejdzie: _sprawi ze zlapane bedzie w pierwszy 'lub', pozniej cyfra zlapie sie w ten pierwszy [], ale juz dalej litera nie przejdzie. W drugi 'lub' sie nie lapie bo zaczyna sie od _. Jesli za pierwszym nawiasem [] w pierwszym 'lub' dodam kolejny nawias ktory juz moze zawierac _, plus * i nie wiadomo co jeszcze, wyjdzie praktycznie to co sam napisalem, a co mi sie wcale nie podoba.
Poza tym nie wiem co to za skladnia, pewnie jakies JS albo cos?

Jutro przepisze to u siebie i przetestuje na moich przykladach, moze faktycznie dziala? W kazdym razie, wielkie dzieki za pomoc.

0

To jest składnia Perl'a, czyli każde szanujące się RegExp powinno być z tym zgodne.

0

XSD (XML Schema Definition) nie jest szanujaca sie implementacja, wiec nie wspiera wielu rzeczy (lookaheads, lookbehinds, capture group, wielu character group itp itd, szkoda gadac). W pytaniu jasno zaznaczylem (chyba nawet tagiem) o jaka skladnie mi chodzi, wiec pisanie odpowiedzi w skladni Perla jest, obawiam sie, nie na temat. A komentarz na temat szanujacych sie implementacji juz calkowicie zbedny.
Niemniej jednak dzieki za wczesniejszy regex, jutro wyprobuje.
Pozdrawiam.

0

Regex nie dziala. Dodatkowo, ten () jest zbedny poniewaz grupuje tylko jedno wyrazenie, mozna go pominac.

0

Ten mi działa (_[a-zA-Z0-9\$\#]|[a-zA-Z0-9\$#])[a-zA-Z0-9_\$#]*
A już by mieć absolutną pewność ^(_[a-zA-Z0-9\$\#]|[a-zA-Z0-9\$#])[a-zA-Z0-9_\$#]*$

0
winerfresh napisał(a)

Ten mi działa (_[a-zA-Z0-9\$\#]|[a-zA-Z0-9\$#])[a-zA-Z0-9_\$#]*
A już by mieć absolutną pewność ^(_[a-zA-Z0-9\$\#]|[a-zA-Z0-9\$#])[a-zA-Z0-9_\$#]*$

Nadal nie dziala (przynajmniej nie zawsze): nie dziala dla stringu _ (samodzielny podkleslnik). Dodatkowo, te 2 pierwsze nawiasy kwadroatowe ktore maja miedzy soba OR chyba sie niczym nie roznia (poza tym ze w drugim plotek nie zostal escapowany)?

0

Ok to z tymi nawiasami to namieszalem, juz rozumiem o co chodzi. Jednak problem nadal jest.
Chyba pora skonczyc, musze zyc z tym co mam ;d Ale dzieki za pomoc.

0

(_[a-zA-Z0-9\$\#]?|[a-zA-Z0-9\$#])[a-zA-Z0-9_\$#]*

0
winerfresh napisał(a)

(_[a-zA-Z0-9\$\#]?|[a-zA-Z0-9\$#])[a-zA-Z0-9_\$#]*

Teraz nie dziala: mozna podac string rozpoczynajacy sie cyfra (nalezy skasowac cyfry z drugiego kwadratowego nawiasu aby sie tego pozbyc, wiec zaden problem), no i nie dziala wyrazenie z tematu watku: __ (2 podkreslniki na poczatku) przechodza - pierwszy podkreslnik zostanie zlapany przed pierwszym nawiasem kwadratowym, pozniej jest opcjonalna litera (ktorej w przypadku __ nie ma), i pozniej ostatni nawias kwadratowy pozwala znowu na podkreslnik.
Nie testujesz na tych przykladach ktore podalem, prawda? Tylko strzelasz. Dzieki za checi, ale nie ma to sensu, dziala to co mam i jak sie nie da latwiej to trudno.

0

Testuję, ale nie chce mi się za każdym razem odpalać Ruby :P

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