2017-01-23 14 views
5

Mam zadanie utworzenia programu, który będzie dopasowywał cyfry bez numerów przed nimi. Na przykład:Regex - Przechwytuj tylko liczby, które nie mają przy sobie litery.

6x^2 + 6x + 6-57 + 8-9-90x

Próbuję użyć wyrażenia regularnego, aby uchwycić wszystkie numery z + lub - przed nimi - ale bez x później. Próbowałem już wykonać próbkę:

\[+-](\d+)[^x] 

, ale wydaje się również przechwytywać "-90" z "-90x".

+0

Wiesz Regex służy jako szablon do dopasowywania wzorca znaków do wyszukiwanego ciągu. Oznacza to, że jest to funkcja logiczna. Nie wiem, co masz na myśli przez "schwytanie". – yazanpro

+0

Chcę, aby wyszukiwane były tylko liczby bez znaków X, więc mogę je zastąpić. – Netheous

+0

czy przechwytuje '' -90'' lub po prostu '' 90'' z '-90x''? jeśli po pierwsze, to nie wydaje się normalne, jeśli drugie, może oznacza to ostatnie "x", a nie pierwsze, ponieważ po "6x" istnieją inne znaki, więc pasuje do '^ x'. Nie można dopasować do "90x", ponieważ nie ma innych znaków. Myślę, że '[^ x]' jest tu błędne. – Kaddath

Odpowiedz

8

Prawidłowe Regex byłoby to:

@"[+-]((?>\d+))(?!x)" 

Alternatywne rozwiązanie nie-NET:

[+-](\d++)(?!x) 

@" 
[+-]   // Prefix non captured 
(    // Begin capturing group 
    (?>   // Begin atomic (non-backtracking) group - this part is essential 
     \d+  // One or more digits 
    )   // End atomic group 
)    // End capturing group 
(?!    // Begin negative lookahead 
    x   // 'x' literal 
)    // End negative lookahead 
" 

Można go here

+1

Jesteś Bogobojcą. – Netheous

+0

Ta odpowiedź byłaby lepsza, gdybyś wyjaśnił * dlaczego *, tj. Co OP zrobił źle w jego/jej wyrażeniu, które się nie powiodło. –

+0

To świetnie. +1 dla "Grupy atomowej", której szukałem. Ale dodałbym wyjaśnienie zastosowanego Regexa. –

0

Głównym problemem przetestować z oryginalnym regex jest to [ jest w ten sposób dopasowany, a literowy [ jest w ten sposób dopasowany, a innym problemem jest (\d+)[^x], który przechwytuje 1+ cyfry i przechwytuje do Grupy 1, a następnie [^x] dopasowuje dowolny znak, ale x. Oznacza to, że może również dopasować cyfrę (tak jak w twoim przypadku, z -90x, [+-] dopasowuje -, (\d+) dopasowuje i przechwytuje 9 i [^x] dopasowuje 0).

Bardziej odpowiednie wyrażenie regularne ma zawierać wzór z x\d do ujemnego lookAhead:

[+-](\d+)(?![\dx]) 

Patrz regex demo.

Wzór Szczegóły:

  • [+-] - albo + lub -
  • (\d+) - Niekorzystny uprzedzona, że ​​nie powiedzie się meczu, jeśli 1+ cyfr - grupa 1 wyników 1 lub więcej cyfr
  • (?![\dx]) Przechwytywanie są poprzedzane cyfrą lub x.