2010-11-15 10 views
10

Czy ktoś mógłby mi pomóc skonstruować tego wyrażenia regularnego proszę ...Wyrażenie regularne, aby wyodrębnić numery z ciągiem

Biorąc pod uwagę następujące ciągi ...

  • „Kwiecień (123 widgety mniej Zębatki 456)”
  • „może mniej (789 widżety 012 zębatkami)”

potrzebuję wyrażenia regularnego, które wyodrębnić dwie liczby z tekstu. Nazwa miesiąca będzie się różnić. Nawiasy nawiasów, "widgetów mniej" i "kół zębatych" nie powinny zmieniać się między łańcuchami, jednak byłoby naprawdę użyteczne, gdyby tekst ten mógł być również zmieniany.

Z góry dziękuję.

Odpowiedz

27

jeśli wiesz na pewno, że tam są tylko będzie 2 miejsca gdzie masz listę cyfr w ciąg i to jest jedyna rzecz, którą zamierzamy pociągnąć na zewnątrz, to powinieneś być w stanie po prostu użyć

\d+ 
+0

Uderzyłeś mnie w to! Powyższe wyrażenie, gdy zostanie zastosowane globalnie do całego ciągu znaków (zależnego od implementacji, aby OP musiał wskazać nam język), wyodrębni liczby i zignoruje resztę. –

+1

Na przykład w ruby ​​będzie to "matches = string.scan (/ \ d + /)" –

+0

Przepraszam, używam implementacji .NET. –

23
^\s*(\w+)\s*\(\s*(\d+)\D+(\d+)\D+\)\s*$ 

powinien działać. Po zakończeniu meczu wartość odsyłacza 1 będzie zawierać miesiąc, odwołanie zwrotne 2 będzie zawierało pierwszą liczbę, a odwołanie zwrotne 3 drugą liczbę.

Objaśnienie:

^  # start of string 
\s* # optional whitespace 
(\w+) # one or more alphanumeric characters, capture the match 
\s* # optional whitespace 
\( # a (
\s* # optional whitespace 
(\d+) # a number, capture the match 
\D+ # one or more non-digits 
(\d+) # a number, capture the match 
\D+ # one or more non-digits 
\) # a) 
\s* # optional whitespace 
$  # end of string 
+2

+1 za wyjaśnienie, ale muszę podać poprawną odpowiedź do Seattle Leonard, ponieważ jest to takie proste. –

+0

Dobre wyjaśnienie Twojego rozwiązania – itsmatt

2

można użyć coś takiego:

[^0-9]+([0-9]+)[^0-9]+([0-9]+).+

Następnie zdobądź pierwszą i drugą grupę przechwytywania.

Powiązane problemy