Warum gibt dieses regex true zurück?
Regex.IsMatch("", "")
Ich habe gegoogelt und es kam nichts heraus.
Warum gibt dieses regex true zurück?
Regex.IsMatch("", "")
Ich habe gegoogelt und es kam nichts heraus.
Ich vermute, dass das, was du gepostet hast, tatsächlich umgekehrt ist, wobei der kürzere Text tatsächlich das Muster ist und die längere Eingabe die Eingabe ist, die abgeglichen wird. In diesem Fall würde dies true zurückgeben, da das Muster alles außer dem letzten Buchstaben im Wort abgleicht.
Zur Klarstellung, ist das Muster, und ist die Eingabe. Da ich Arabisch kann, kann ich dir sagen, dass letzteres tatsächlich eine teilweise Übereinstimmung mit ersterem wäre, so dass das Ergebnis true wäre, wenn die Werte tatsächlich umgekehrt wären. Wenn du dich auf diese Tabelle der arabischen Alphabete beziehst, kannst du sehen, dass der Buchstabe y’ (am Ende der Tabelle) derselbe fragliche Buchstabe ist. Sein Aussehen hängt davon ab, wo er im Wort vorkommt. Im ersten Wort erscheint er am Ende, und im zweiten ist es der vorletzte Buchstabe.
Wenn ich von deinem Post kopiere/einfüge, werden die Werte umgekehrt, was zu einem true-Wert führt. Um besser damit arbeiten zu können, können wir die Wörter auseinander nehmen, um die erwarteten Ergebnisse in beiden Szenarien zu sehen:
string first = "";
string second = "";
Console.WriteLine(Regex.IsMatch(first, second)); // false
Console.WriteLine(Regex.IsMatch(second, first)); // true
Dies ist ein interessantes Ergebnis von Textrendering-Regeln, die für Prosa, nicht für Code, entwickelt wurden.
Das erste Argument in Ihrem Methodenaufruf wie oben geschrieben, ist "", das Argument, das auf der rechten Seite gerendert wird. Dieses längere Argument ist die Eingabe, und der kürzere Teilstring, der links gerendert wird, ist tatsächlich das Muster, daher die Übereinstimmung.
(*: dies unter der Annahme, dass Ihr Browser weiß, wie man eine Rechts-nach-Links-Renderung durchführt. Wenn Sie den Code-Schnipsel in einen Editor oder eine Konsole einfügen, die keine komplexe Textlayout-Unterstützung hat, sehen Sie es so, wie es wirklich ist... obwohl der arabische Text dann kaputt sein wird.)
Der Trick besteht darin, dass Satzzeichen wie Anführungszeichen und das Komma richtungslos sind, sodass sie je nach Umgebung von links nach rechts oder von rechts nach links gerendert werden können. Die logische Reihenfolge des Auszugs ist:
>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<
>>
Regex.IsMatch("", "")
(Was die weiterhin verwirrende Eigenschaft hat, dass die Anführungszeichen, die scheinbar um jeden separaten Parameter stehen, tatsächlich keine sind.)
Dies ergibt in gewisser Weise Sinn für Abschnitte von lesbaren gemischten Sprachen, macht Code aber sehr verwirrend! Sie können dies verhindern, indem Sie den Lauf richtungsloser Zeichen mit etwas unterbrechen, das eine Links-nach-Rechts-Richtung hat:
Regex.IsMatch("", /* foo */ "")
Dies ist funktional derselbe Code wie das Original, aber er wird ganz anders angezeigt. Sie können beobachten, wie sich die Positionen der Argumente ändern, wenn Sie den ersten lateinischen Buchstaben eingeben.
Es scheint, dass Regex.IsMatch()
angibt, ob das Regex in der Zeichenfolge vorhanden ist, nicht dass die gesamte Zeichenfolge dem Regex entspricht (laut den Dokumenten, es "Gibt an, ob der angegebene reguläre Ausdruck eine Übereinstimmung in der angegebenen Eingabezeichenfolge findet."). Das erste Argument ist die Eingabe, das andere ist das Muster gemäß den Dokumenten, aber hier scheint es umgekehrt zu sein. Das letzte (linksaußen) Zeichen sieht in den beiden Zeichenfolgen unterschiedlich aus, aber das liegt wahrscheinlich am Renderverhalten von Ligaturen. Wenn die Zeichenfolgen als UTF-8-Bytes abgelegt werden, sind sie:
d8 a7 d9 84 d8 b9 d8 b3 d9 83 d8 b1 d9 8a
und
d8 a7 d9 84 d8 b9 d8 b3 d9 83 d8 b1 d9 8a d8 a9
also ist das erste eigentlich ein Teilstring des anderen, was die Übereinstimmung erklären würde (es erfordert tatsächlich, dass die Argumentreihenfolge tatsächlich umgekehrt ist, im Vergleich zu dem, was in der Dokumentation steht).
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.