2015-06-02 16 views
6

gerade begonnen, Regex zu schätzen und ich üben es auf regexone.com meine Frage ist die Erklärung über Kleene "*" gegeben. Ich kam mit einer Antwort auf meine eigene“Unterschied mit Kleen Regex Ausdruck

[a-c]* 

, aber die Lösung ist:?

aa+b*c+ or a*b*c* 

ist es Unterschiede in Bezug auf das Verhalten mit den beiden vor allem, wenn ich es mit Javascript verwenden

leid für mein schlechtes Englisch.

Antwort

7

Das Problem nur unzureichend definiert ist, da es keine negativen Beispiele.

Zum Beispiel, wenn sie Sie in der medizinischen Fakultät fragen, "wie heißt das Gerät, das amputiert", "ein Auto" ist technisch korrekt, aber wahrscheinlich nicht das, was sie hören wollten (wie eine Reihe von Autounfällen endet) Menschen mit abgeschnittenen Gliedmaßen). Aber die Frage lautete: "Wie heißt das Instrument, mit dem ein Mediziner während der Operation eine Amputation durchführen würde?" Die Antwort kann nicht mehr "ein Auto" sein.

In ähnlicher Weise funktioniert Ihre Lösung für alle vorgesehenen Fälle, aber sie ist nicht so genau wie die ihre. Zum Beispiel wird "cba" von Ihrem Ausdruck erkannt, wird aber von ihren abgelehnt (zumindest nicht als Übereinstimmung der gesamten Zeichenfolge; a*b*c* entspricht trivial "cba" als 0-Länge-Übereinstimmung an einer beliebigen Stelle in der Zeichenfolge und als 1-Länge-Übereinstimmung von das "a" Bit). In der Tat ist .* auch eine gültige (aber völlig ungenaue) Lösung für ihr Problem.

+0

Können Sie mir bitte ein Beispiel geben, wie meine Lösung scheitern könnte? Ich würde es für das Lernen schätzen :) – loki9

+0

Es kann nicht auf ihre Beispiele. Wenn sie ein Beispiel hätten, in dem sie sagten "es kann keine leere Zeichenfolge finden", dann wäre Ihre Lösung falsch gewesen; aber sie taten es nicht, also ist es nicht. Es ermöglicht lediglich mehr Lösungen als ihre Lösungen. Tatsächlich sagen sie im dritten Absatz sogar etwas Ähnliches. Wo hast du gesehen, dass "die Lösung" aa + b * c + 'oder' a * b * c * '" ist? – Amadan

+0

unter dem Textfeld, in das Sie Ihre Lösung eingeben. Dort steht ein Text, der besagt: "Löse die obige Aufgabe, um mit der nächsten Lektion fortzufahren, oder lies die Lösung." Klicken Sie auf den Lösungslink – loki9

1

Es gibt keinen Unterschied im allgemeinen Regex-Verhalten in JavaScript und in anderen Sprachen. Die Aufgabe erfordert grundsätzlich, dass Sie die restriktivste Regex angeben, die den bereitgestellten Mustern entspricht. Sie bieten auch eine alternative Antwort, um zu zeigen, dass Sie das Muster auch mit einer weniger restriktiven Regex vergleichen können. Die Dinge suchen mit den dafür vorgesehenen Mustern sind die folgend:

  1. Es gibt immer Paare von a es: aa, aaaa
  2. Es gibt 0 oder mehr b es: b, bbbb, keine b
  3. ist 1 oder mehr c am Ende: cc, c, cc
  4. die Buchstaben in dieser Reihenfolge immer kommen: abc

Es gibt eine Menge von regex Sie um aufwarten kann diese vier Bedingungen anzupassen, so dass Sie die restriktivste eine Bereitstellung müssten, um zu versuchen, um die Daten außerhalb dieser Beispiele zu minimieren. Selbst mit der angegebenen Antwort stimmen Sie unendlich viele andere Saiten ab.

Eine noch restriktivere regex wäre:

^(aa)+b*c+$ 

Hier ist die regex erfordert, dass die Zeichenfolge mit aa beginnt und endet mit einem c. Ich nehme an, dass die Lektionen immer noch nicht an ^ und $ gelangt sind und die Antwort daher nicht diese enthält.

+2

"Es gibt keinen Unterschied im' regex' Verhalten in 'JavaScript' und in anderen Sprachen" .. Solange du dich an Grundlagen wie Kleene-Sterne hältst. Es gibt sicherlich Unterschiede in den erweiterten Funktionen (insbesondere JS unterstützt Lookbehind, Rekursivität, Unterprogramme, benannte Captures, Conditionals ...) – Amadan

+0

@Amadan meinte ich im Allgemeinen und gegeben das früh genug Tutorial, das zur Verfügung gestellt wird. Wenn die Antwort alle Unterschiede zwischen den verschiedenen Regex-Engines erklärt, wird die Antwort viel zu lang. Sie haben recht, die Implementierung führt zu Unterschieden in den Engines, aber dennoch sind reine Rechentheorie-Sichtweisen reguläre Ausdrücke äquivalent zu endlichen Automaten und sind auf der ganzen Linie einheitlich. –

+1

Ja, aber was Leute auf SO reguläre Ausdrücke aufrufen (und was regexone auswertet) sind keine theoretischen regulären Ausdrücke, und sie sind überhaupt nicht äquivalent zu FA. Wenn wir auf [CS.SE] (http://cs.stackexchange.com/) wären, würde ich diesen Kommentar nicht machen. Aber deine Bearbeitung ("allgemein") ist alles, was ich wollte - ich mag es nicht, wenn Leute der Einfachheit halber lügen, aber solange sie sagen: "Nun, nicht wirklich, aber du musst noch keine Details wissen", ist es gut. Verhindert alle Arten von Verwirrung, wenn jemand versucht, '/ (? <= A) b /' zu bewerten und sie sind wie "WTF regexp soll überall gleich sein!" – Amadan