Pytanie w sprawie c#, regex, .net – Użycie wyrażenia regularnego do wyodrębnienia wielu liczb z łańcuchów

7

Mam ciąg z dwiema lub więcej liczbami. Oto kilka przykładów:

"(1920x1080)"
" 1920 by 1080"
"16 : 9"

Jak mogę wyciągnąćoddzielny liczby takie jak „1920” i „1080”, zakładając, że będą one po prostu oddzielone jednym lub większą liczbą znaków nieliczbowych?

@ Wypełnione, gotowe. David
Wybierz język, w którym potrzebujesz odpowiedzi. Obiekty wyrażeń regularnych w .NET nie są takie same jak obiekty Java. Oded

Twoja odpowiedź

5   odpowiedzi
0

wszystkie powyższe odpowiedzi uwzględniają poprawne liczby 12i lub a2, gdy nie powinny.

Następujący problem może rozwiązać ten problem

var matches = Regex.Matches(input, @"(?:^|\s)\d+(?:\s|$)");

Ale to rozwiązanie dodaje jeszcze jeden problem :) Pozwoli to uchwycić spacje wokół liczby całkowitej. Aby rozwiązać ten problem, musimy przechwycić wartość liczby całkowitej w grupie:

MatchCollection matches = Regex.Matches(_originalText, @"(?:^|\s)(\d+)(?:\s|$)");
HashSet<string> uniqueNumbers = new HashSet<string>();
foreach (Match m in matches)
{
    uniqueNumbers.Add(m.Groups[1].Value);
}
5

postępując zgodnie

MatchCollection v = Regex.Matches(input, "[0-9]+");
foreach (Match s in v)
            {
                // output is s.Value
            }
Zazwyczaj ćwiczę z RegexOptions.IgnoreCase. Przepraszam za pomyłkę Md Kamruzzaman Sarker
Nie błąd jako taki. Po prostu nie jest potrzebne w tym przypadku. Oded
RegexOptions.IgnoreCase nie jest potrzebne. Cyfry rzymskie nie mają górnych / dolnych liter. Oded
1

możesz użyć

string[] input = {"(1920x1080)"," 1920 by 1080","16 : 9"};
foreach (var item in input)
{
    var numbers = Regex.Split(item, @"\D+").Where(s => s != String.Empty).ToArray();
    Console.WriteLine("{0},{1}", numbers[0], numbers[1]);
}

WYDAJNOŚĆ:

1920,1080
1920,1080
16,9
Tak, zaktualizowany, dzięki @David Damith
dobrze, ale często zwraca dodatkowe puste ciągi. David
1
(\d+)\D+(\d+)

aby dopasować je do języka, którego będziesz używać.

@Rawling - Tak, są. Źle postawiony przeze mnie. Oznacza cyfry zwykle używane na zachodzie, a inne skrypty. Oded
Czy mógłbyś wyjaśnić przewagę tego rozwiązania nad Regex.Matches (s) [0-9] + ”)? David
Jeśli znak jest zdefiniowany jako cyfra Unicode, zostanie dopasowany w .NET przez\d. Oded
\d będzie zawieraćwszystko cyfry, nie tylko cyfry rzymskie, w zależności od biblioteki wyrażeń regularnych i platformy. Oded
10

Podstawowe wyrażenie regularne to:

[0-9]+

Musisz użyć biblioteki, aby przejrzeć wszystkie mecze i uzyskać ich wartości.

var matches = Regex.Matches(myString, "[0-9]+");

foreach(var march in matches)
{
   // match.Value will contain one of the matches
}

Powiązane pytania