Frage

Ich habe regex Muster gesehen, die Wiederholung explizit statt ?, * und + nummeriert verwenden, das heißt:.

Explicit            Shorthand
(something){0,1}    (something)?
(something){1}      (something)
(something){0,}     (something)*
(something){1,}     (something)+

Die Fragen sind:

  • Sind diese beiden Formen identisch? Was passiert, wenn Sie besitzergreifend / ungern Modifikatoren?
  • hinzufügen
  • Wenn sie identisch sind, welche ist mehr idiomatische? Mehr lesbar? Einfach "besser"?
War es hilfreich?

Lösung

Mein Wissen sind sie identisch. Ich denke, es vielleicht ein paar Motoren gibt, die nicht über die nummerierten Syntax unterstützen, aber ich bin nicht sicher, welche. Ich erinnere mich vage eine Frage auf SO vor ein paar Tagen, wo explizite Notation nicht funktionieren würde in Notepad ++.

Das einzige Mal, würde ich explizit Wiederholung nummeriert verwenden ist, wenn die Wiederholung ist größer als 1:

  • Genau zwei: {2}
  • Zwei oder mehr: {2,}
  • Zwei bis vier: {2,4}

Ich neige dazu, diese besonders zu bevorzugen, wenn die wiederholten Muster mehr als ein paar Zeichen ist. Wenn Sie 3 Zahlen übereinstimmen müssen, wie einige Leute schreiben: \d\d\d aber ich würde eher schreiben \d{3} da sie die Anzahl der Wiederholungen beteiligt betont. Weiterhin auf der Straße, wenn diese Zahl jemals ändern muss, ich habe nur Änderungen {3} zu {n} müssen und nicht zur Wieder Parse der Regex in meinem Kopf oder Sorgen um es vermasselt; es erfordert weniger geistige Anstrengung.

Wenn das Kriterium nicht erfüllt ist, ziehe ich die Kurz. die „explizite“ Notation schnell clutters das Muster und macht es schwer zu lesen. Ich habe an einem Projekt gearbeitet, wo einige Entwickler nicht allzu gut wusste regex (es ist nicht genau das Lieblingsthema von Dir sein) und ich sah Vorkommen viel {1} und {0,1}. Einige Leute würden mich fragen, zu Code-Review ihre Muster und das ist, wenn ich diese Vorkommnisse zu Kurzschreibweise ändern würde vorschlagen, und spart Platz und IMO, zur Verbesserung der Lesbarkeit.

Andere Tipps

kann ich sehen, wie, wenn Sie einen regulären Ausdruck haben, die eine Menge von beschränkter Wiederholung tut, könnte man die {n,m} Form zur besseren Lesbarkeit willen konsequent nutzen wollen. Zum Beispiel:

/^
 abc{2,5}
 xyz{0,1}
 foo{3,12}
 bar{1,}
 $/x

Aber ich kann mich nicht erinnern jemals einen solchen Fall im wirklichen Leben sehen. Wenn ich sehe, {0,1}, {0,} oder {1,} in einer Frage verwendet wird, ist es so gut wie immer wird die Unwissenheit getan werden. Und in dem Prozess, eine solche Frage zu beantworten, sollten wir auch vorschlagen, dass sie verwenden, um die ?, * oder + statt.

Und natürlich ist {1} reine Unordnung. Manche Menschen scheinen eine vage Vorstellung zu haben, dass es bedeutet „ein und nur ein“ - schließlich ist es bedeuten muss etwas , nicht wahr? Warum sollte eine solche pathologisch lapidare Sprache ein Konstrukt unterstützen, die eine ganze drei Charaktere in Anspruch nimmt und tut gar nichts? Seine einzige legitime Anwendung, die ich kenne ist eine Rückreferenzierung zu isolieren, die durch eine wörtliche Ziffer (z \1{1}0), aber es gibt auch andere Möglichkeiten, das zu tun, gefolgt wird.

  • Sie sind alle gleich, wenn Sie einen außergewöhnlichen Regex-Engine verwenden. Allerdings sind nicht alle Regex-Engines unterstützen Wiederholung, ? oder + nummeriert.

  • Wenn alle ihnen zur Verfügung stehen, würde ich Zeichen verwenden, anstatt Zahlen, einfach weil es für mich intuitiver ist.

Sie sind äquivalent (und Sie werden, wenn sie verfügbar sind herauszufinden, von Ihrem Kontext zu testen.)

Das Problem, das ich antizipieren würde, wenn Sie nicht die einzige Person, die jemals an der Arbeit mit Ihrem Code benötigt, sein können. Reguläre Ausdrücke sind schwierig genug für die meisten Menschen. Immer wenn jemand nutzt eine ungewöhnliche Syntax, die Frage entsteht: „Warum sie es den normalen Weg nicht taten Was dachten sie, dass ich fehle“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top