Forum: PC-Programmierung C# Pattern Matching


von Daniel -. (root)


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

von Cyblord -. (cyblord)


Lesenswert?

Daniel -. schrieb:
> 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?

Schlaganfall oder völlig unklare Ausdrucksweise?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Daniel -. schrieb:
> Bug

Nein.

> oder ein mir unbekanntes Feature?

Wenn du Regex B verstanden hast, dann nein.

Schau dir den Ausdruck noch einmal Zeichen für Zeichen an.

Ich habe auch ein paar Minuten gebraucht, bis es in meinem Kopf geklickt
hat ;-)

von Daniel -. (root)


Lesenswert?

Hi Yalu,

ich habe es geschnallt
Danke für Hinweis :)

Gruß,
Daniel

von Klaus P. (kpi6288)


Lesenswert?

regex101.com sagt zu Ausdruck A:

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

',' ist index 44.

von Ob S. (Firma: 1984now) (observer)


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.

von Yalu X. (yalu) (Moderator)


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."

: Bearbeitet durch Moderator
von Ob S. (Firma: 1984now) (observer)


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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Gerne :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.