jak napisac wyrazenie regularne

0

Chce napisac wyrazenie regularnet w takim formacje:

100,250,500

nie mozna uzywac na poczatku i na koncu przecinka. I nie mozna duzywac tego: ,, or ,,,,,, tylko jeden przecinek, rozdzielajacy.

: "^[0-9]{1}{1,500, }[0-9]{1}*$"

0

Napislem cos takiego: "^([0-9]{1,500}[,]{1}[0-9]{1,500})*?$"

0

Nie opisałeś za dobrze co chcesz osiągnąć :P

np: ^[0-9]{3},[0-9]{3},[0-9]{3}$

Złapie twój wzór.

0

muszę wprowadzić taki ciąg: 100,200,500,100,2000,1000,900 etc etc.
liczba, przecinek, liczba przecinek :) Maksymalna długość to 500 znaków.

bez spacji

0

to powinno odwalić całą robotę: ^(?:[\d]+,)*[\d]+$

0

ooo ja :D a mozesz chociaz mniej wiecej opisac jak dziala to wyrazenie regularne? prosze :) co to te \d
?

0

to wyrażenie można zapisać prościej: ^(\d+,)*\d+$

(\d+,)* - szuka sekwencji: liczba (1,2,... razy) i przecinek, a cała sekwencja może wystąpić 0,1,2,... razy
\d+ - szuka: liczba 1,2,... razy

jak skleisz to w logiczną całość to będzie dopasowywać takie ciągi 100 i takie 100,200 i tak dłuższe

kleisz? :)

0

?: - oznacza ignorowanie grupy przechwytującej, grupa przechwytująca to to co umieścisz pomiędzy nawiasami ()
nie jest to tutaj konieczne, napisałem z rozpędu :)

0

To nie działa. 100,200 przejdzie. ale takie licznby jak np: 100 też powinno przejsc. a nie przechodzi

1

Szczerze mówiąc pewnie ci nie pomogę, ale jestem w trakcie nauki F# i z wyrażeń regularnych w nim jeszcze nie korzystałem. Więc bardziej pomagam sobie niż tobie ;).
Samo wyrażenie wygląda tak: ^(?=^.{1,500}$)(?:(?<number>\d+)(?:,(?!$))?)+$.
Na samym początku mamy (?=^.{1,500}$), czyli positive lookahead. Sprawdzamy w nim tylko to czy cały nasz ciąg ma przynajmniej jeden znak i co najwyżej 500. Jeżeli tak to przechodzimy dalej. W środku mamy grupę non-capture, w której są dwie kolejne. Pierwsza jest bardzo prosta, pobiera naszą liczbę. W drugiej zajmujemy się przecinkiem, który może oddzielać od siebie liczby, ale nie może wystąpić na samym końcu, co sprawdzamy za pomocą negative lookahead: (?!$).
Tutaj korzystający z wyrażeń regularnych w wydaniu PCRE powiedzą, że to wyrażenie jest niewiele warte, bo nie da się matchować powtarzających grup w pojedynczym matchu - każdy następny będzie nadpisywany i zostaniemy z ostatnim. I tutaj z pomocą przychodzi nam silnik wyrażeń regularnych w .NET, który dodatkowo zapisuje na boku wyniki z matchowania tej samej grupy co każde jej powtórzenie. Niektórzy sądzą, że to niepotrzebne odstępstwo od PCRE, ale skoro już jest to dlaczego nie skorzystać. Wyrażenia regularne rozwijają się tak samo jak wszystko inne (jeszcze kiedyś nie wszystkie silniki obsługiwały lookarounds, a dzisiaj mamy w nich subroutiny i rekurencję).

I w ten sposób powstała nam funkcja:

let captureNumbers input =
    let match' = Regex.Match(input, @"^(?=^.{1,500}$)(?:(?<number>\d+)(?:,(?!$))?)+$")
    if match'.Success then
        try
            Some([ for capture in match'.Groups.["number"].Captures -> Int32.Parse(capture.Value) ])
        with
            | :? OverflowException -> None
    else
        None

Zwraca nam Some z sekwencją liczb bądź None, jeżeli wejście nie pasuje do wzorca albo któraś z liczb jest większa niż Int32.

Użyć jej możemy w ten sposób:

let inputs = Console.In.ReadToEnd().Split('\n') |> Seq.ofArray
let padding = inputs |> Seq.map (fun line -> line.Length) |> Seq.max

for input in inputs do
    printf "%*s: " padding input
    match captureNumbers input with
        | Some(numbers) -> printfn "%A" numbers
        | None -> printfn "no match"

Tadam. Kompletnie bezużyteczny dla ciebie kawałek kodu :>.

0
Rev napisał(a):

^(?=^.{1,500}$)(?:(?<number>\d+)(?:,(?!$))?)+$

sprawdzanie długości ciągu lepiej zrobić w normalny sposób w programie zamiast zwalać to na wyrażenia regularne jeżeli jest taka możliwość
lookahead też jest relatywnie wolny i zamiast sprawdzać czy przecinek nie występuje na końcu, lepiej zamienić wyrażenie na takie które na końcu wymaga cyfry (wychodzi na jedno a wyrażenie przyspiesza)

0

dlaczego ta funkcja nie dziala?
$.validator.addMethod("regex",function(value, element, regexp) {

        result = value.match(regexp);
        alert( regexp );
        return result;
        /*var re = new RegExp(regexp);
        return this.optional(element) || re.test(value);*/
    }
);

tak ja wywoluje: regex: "/^(?:\d+,)*\d+$/"

Jak wkleje zamiast zmiennej regexp, cale wyrazenie to wszystko dziala.

Nie rozumiem czego tam moze brakowac?

0

match przyjmuje jako argument obiekt wyrazenia regularnego, a Ty masz string

jesli chcesz utworzyc obiekt wyrazenia regularnego ze stringa uzyj konstruktora: new RegExp("/^(?:\d+,)*\d+$/")

to co masz zakomentowane prawdopodobnie (nie testowalem) bedzie dzialac

0

nie smiga:

var result = new RegExp(regexp);
alert(result.test(value) );

1

jak zastapisz \d -> [0-9] to smiga - http://jsfiddle.net/uxHXX/

0

Cholera, fakt! Cos musialem na ostrosci pomieszac ... Dzieki za pomoc! masz lapke w gore za to ode mnie ;)

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