C# Pattern Matching

OP #7563884
Lesenswert?

Hallo zusammen,

1
using System;
2
using System.Text.RegularExpressions;
3
          
4
public class Program {
5
  public static void Main() {
6
    //Regex p = new Regex(@"^[.0-9+-.]+$");  // A
7
                Regex p = new Regex(@"^[.0-9+-]+$");    // B
8
    Match m = p.Match(",");
9
    if(m.Success) {
10
      Console.WriteLine("match");
11
    } else {
12
      Console.WriteLine("no match");
13
    }
14
  }
15
}

Warum "match"-ed ist die Variante A auch ','?

Die Variante B verhält sich wie gewollt, ',' wird nicht als gültig erkannt.

Bug oder ein mir unbekanntes Feature?

Gruß, Daniel

(Firma: 1984now) #7564629
Lesenswert?

Klaus P. schrieb:

regex101.com sagt zu Ausdruck A:

+-. matches a single character in the range between + (index 43) and . (index 46) (case sensitive)

Klar, das ist halt die normale Funktionalität des "-" in solchen Ausdrücken.

Ja. Interessanter ist aber, was bei Ausdruck B eigentlich passiert. Rein formal ist der nämlich wohl illegal. Zumindest habe ich niergendwo was dazu finden können, wie das "-" behandelt wird, wenn keine obere Bereichsgrenze angegeben ist. Offenbar ja so, dass es seine besondere Bedeutung "verliert".

Dokumentiert ist das aber meines Wissens nach nicht.

Moderator #7564687
Lesenswert?

Ob S. schrieb:

Dokumentiert ist das aber meines Wissens nach nicht.

Doch, hier:

https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#positive-character-group--

"Because a positive character group can include both a set of characters and a character range, a hyphen character (-) is always interpreted as the range separator unless it is the first or last character of the group."

Das ist nicht nur bei .NET, sondern auch bei praktisch allen anderen Regex-Prüfern so, insbesondere auch in POSIX:

https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html

"The <hyphen-minus> character shall be treated as itself if it occurs first (after an initial '^', if any) or last in the list, or as an ending range point in a range expression."

(Firma: 1984now) #7564696
Lesenswert?

Yalu X. schrieb:

Doch, hier:

https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#positive-character-group--

"Because a positive character group can include both a set of characters and a character range, a hyphen character (-) is always interpreted as the range separator unless it is the first or last character of the group."

Man kann hier doch tatsächlich gelegentlich wirklich noch was lernen. Also ganz ernsthaft: danke für diesen Link.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren