Wir bestehen die Herausforderung von Callum Macrae zu 100%

Ich schlage vor, 10 Regex-Tests von Callum Macrae zu lösen. Im Gegensatz zu meiner vorherigen Analyse der Herausforderung gibt es keine ehrlich einfachen und sogar durchschnittlichen Aufgaben. Wie sie sagen - nur Regex, nur Hardcore.


Da die Herausforderung ziemlich kompliziert ist, ist es nicht notwendig, alle Regeln wie ich zu befolgen. Jeder Test besteht zu 100% - das bedeutet, dass Sie ein Superprofi sind. Willkommen!


Ja, ich weiß, diese Herausforderung wurde bereits einmal veröffentlicht . Aber der Autor des Beitrags präsentierte keine funktionierenden Lösungen, und in den Kommentaren konnten die Leute keine weiteren 4 Probleme lösen und verstanden häufiger nicht einmal die Bedeutung der Aufgabe und was sie von ihnen wollten.


Deshalb poste ich es noch einmal mit einer detaillierten Übersetzung, Erklärung und allen vertraulichen Brötchen.


Aufgabe 1 - Markieren Sie doppelte Wörter


http://callumacrae.imtqy.com/regex-tuesday/challenge1.html


Es gibt eine Reihe von Sätzen, in diesem Satz können doppelte Wörter enthalten sein. Es ist notwendig, sich wiederholende Wörter hervorzuheben.


Ein Beispiel:


This is is a test 

In diesem Fall wird das Wort "ist" zweimal wiederholt und fett hervorgehoben:


 This is <strong>is</strong> a test 

Hinweis

Es ist notwendig, Wiederholungen von Wörtern zu finden, und Wörter werden daher durch ein Leerzeichen getrennt - ein Leerzeichen ist erforderlich. In regulären Ausdrücken ist es technisch möglich, Wiederholungen nur über den Backlink zu finden.


Lösung

Ausdruck:


 /\b([\w']+)\s(\1)\b/gi 

Ersatz:


 $1 <strong>$2</strong> 

Parsing-Lösung
  • "\ b" - sollte an der Wortgrenze beginnen
  • "([\ w '] +)" - eine beliebige Anzahl von Buchstaben, Zahlen und Apostroph (Sie können es auch mit einem anderen als einem Leerzeichen lösen) und stellen Sie sicher, dass Sie es in einer Gruppe erfassen, weil Als nächstes müssen Sie Wiederholungen dieser Gruppe finden.
  • "\ s (\ 1)" - weil wir wissen, dass die Wiederholung nach dem Leerzeichen kommt, setzen wir ein Leerzeichen "\ s" und schreiben, dass danach die Wiederholung der zuvor erfassten ersten Gruppe "(\ 1)" folgen muss.
  • "\ b" - Die Wiederholung muss mit der Wortgrenze enden, sonst riskieren wir, nur einen Teil des Wortes zu erfassen.

Aufgabe 2 - Graustufen


http://callumacrae.imtqy.com/regex-tuesday/challenge2.html


Es gibt Farbcodes in verschiedenen Formaten, die Aufgabe besteht darin, alle Graustufen zu finden.


Beispiele für gültige Codes:


 #eEe #6F6F6F rgb(2.5, 2.5,2.5) hsl(0, 10%, 100%) 

Beispiele für ungültige Codes:


 #eEf #11111e rgb(1.5%, 1.5%, 1.6%) hsl(20, 20%, 20%) 

Code-Erklärungen

Die wichtigste Frage bei dieser Aufgabe ist, was als grau angesehen wird.


Grau ist laut Wikipedia:


Viele der Farben, die durch Kombination der drei Primärfarben des RGB-Farbmodells erhalten werden - Rot, Grün und Blau in gleichen Konzentrationen .

Codes, die mit # beginnen, haben das Hex-Format und sind in zwei Formen erhältlich. Abgekürzt, drei Zeichen (#rgb) und voll, sechs Zeichen $ rrggbb. Wobei r, g, b die drei Grundfarben sind.
Die rgb (r, g, b) -Codes sind genau gleich, sie werden nur in Zahlen von 0 bis 255 geschrieben.
Das hsl-Format ist etwas komplizierter, die Zahlen bedeuten hier Ton, Sättigung und Helligkeit. Um zu verstehen, unter welchen Bedingungen beispielsweise drei Primärfarben zu gleichen Anteilen erhalten werden, können Sie mit diesem visuellen Editor herumspielen.


Hinweis

Für das abgekürzte Hex ist das korrekte Auftreten die Wiederholung aller drei Zeichen, zum Beispiel #aaa. Wiederholen Sie für ein vollständiges Hex zwei Zeichen, z. B. #efefef. Wiederholen Sie für digitales RGB die Ziffern, z. B. RGB (2, 2, 2). Das Verständnis des hsl-Formats ist etwas komplizierter, aber wenn Sie das Obige noch kennen, können Sie verstehen, dass hier die graue Farbe die Farbe ist, bei der der Ton 0 oder die Sättigung 0 oder 100 ist.


Dementsprechend müssen Sie wie in der vorherigen Aufgabe den Backlink verwenden. Der resultierende reguläre Ausdruck ist groß (dies ist normal), da Sie viele verschiedene Optionen berücksichtigen müssen, einschließlich der falsch geschriebenen.


Lösung
 /^(?:#(\w)\1\1|#(\w{2})\2\2|rgb\(((?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])%?(?:\.\d+)?),[ ]?[0]*\3,[ ]?[0]*\3\)|rgba\(([\d.]+%?),[0 ]*\4,[0 ]*\4,[^)]+\)|hsla?\([\d.]+,[ ]*(0%[^)]+|[\d.]+%,[ ]*(0|100)%[^\)]*)\))$/i 

Parsing-Lösung

Für jede Farbe wird ein separates Rugular geschrieben, das wir separat analysieren:


 #(\w)\1\1 

  • "(\ w)" nimmt ein einzelnes Zeichen in der Gruppe.
  • "\ 1 \ 1" - und geben Sie an, dass es zweimal wiederholt werden soll.

Für zwei Charaktere das gleiche - ich werde nicht wiederholen.


 rgb\(((?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])%?(?:\.\d+)?),[ ]?[0]*\3,[ ]?[0]*\3\) 

Ich möchte "rgba?" Schreiben. Ein Fall ist jedoch möglich, wenn der vierte Parameter in rgb () angegeben ist. Daher müssen rgb und rgba separat beschrieben werden:


  • "\ d {1,2} | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]" - der Bereich reicht von 0 bis 255. Ich werde ihn nicht im Detail analysieren, Sie können sich Aufgabe 5 hier ansehen.
  • "(?: \. \ d +)?" - eine optionale Gruppe, deren Nummer nicht zugewiesen ist. Ein Punkt und eine Zahl nach einem Punkt sind möglich (dies gilt für nicht ganzzahlige Zahlen).
  • ", []? [0] * \ 3" - ein obligatorisches Komma, gefolgt von 0 oder 1 Leerzeichen, 0 oder vielen Nullen, wonach der Wert der zuvor erfassten Gruppe wiederholt werden sollte.

In rgba () - das gleiche, aber 4 Parameter sind erforderlich.


 hsla?\([\d.]+,[ ]*(0%[^)]+|[\d.]+%,[ ]*(0|100)%[^\)]*)\) 

Hier müssen Sie auf gute Weise auch hsl und hsla trennen, aber in den Testfällen gibt es keinen solchen Fall, daher schreiben wir ein wenig "hsla?".


  • "[\ d.] +, [] *" - zuerst kommt die erforderliche Nummer "[\ d.] +" (einschließlich nicht einer ganzen Nummer) mit einem obligatorischen Komma und einem optionalen Leerzeichen "[] ​​*".
  • "(0% [^)] + | [\ d.] +%, [] * (0 | 100)% [^)] *" - und dann sind zwei Optionen möglich: 1) wobei 0% zuerst kommt und dann jede anderes Zeichen als das schließende Zeichen der Klammer [^)] +; 2) Es gibt eine beliebige Zahl mit einem obligatorischen Prozentzeichen und einem Komma "[\ d.] +%" Und dann entweder 0% oder 100% "(0 | 100)%".

Aufgabe 3 - Termine finden


http://callumacrae.imtqy.com/regex-tuesday/challenge3.html


Es gibt eine Liste von Daten, aus diesen Daten finden Sie Daten von 1000 bis 2012, einschließlich im Format JJJJ / MM / TT HH: MM (: SS). Wo jeder Buchstabe eine erforderliche Zahl ist und in Klammern steht, ist keine Voraussetzung.


Beispiel


 2001/09/30 23:59:11 

Hinweis

"[0-9]" ist kein Zahlenbereich, sondern ein Ausdruck, der bedeutet, dass ein einzelnes Zeichen von 0-9 gültig ist. In regulären Ausdrücken gibt es keinen Bereich für große Zahlen, aber aus solch kleinen Stücken können Sie einen regulären Ausdruck erstellen, der den gewünschten Bereich abdeckt. Beispiel: "1 [0-9]" - ein Bereich von 10 bis 19.


Lösung
 /^(1[\d]{3}|200\d|201[0-2])\/(0[1-9]|1[0-2])\/(0[1-9]|1[0-9]|2[0-9]|3[0-2])\s(0[0-9]|1[0-9]|2[0-3]):([0-5][\d])(:([0-5][\d]))?$/ 

Parsing-Lösung
  • Das gültige Jahr ist "(1 [\ d] {3} | 200 \ d | 201 [0-2])", wobei in der Reihenfolge von 1000 bis 1999, von 2000 bis 2009, von 2010 bis 2012.
  • Monat "(0 [1-9] | 1 [0-2])". Von 01 bis 09 und von 10 bis 12.
  • Tag "(0 [1-9] | 1 [0-9] | 2 [0-9] | 3 [0-2])". Von 01 bis 09 und von 10 bis 19, von 20 bis 29 und von 30 bis 32.
  • Stunde "(0 [0-9] | 1 [0-9] | 2 [0-3])". Von 00 bis 09 und von 10 bis 19, von 20 bis 23.
  • Minute "([0-5] [\ d])". 00 bis 59
  • (: ([[0-5] [\ d]))? - optionale Sekunden von 00 bis 59.

Aufgabe 4 - Kursivschrift


http://callumacrae.imtqy.com/regex-tuesday/challenge4.html


Es gibt einen Text mit MarkDown-Markup (genau wie beim Habré). Sie müssen einen regulären Ausdruck schreiben, der die Wörter zwischen den Sternchen durch das <em> -Tag ersetzt.


Beispiel


 *This text is italic.* -> <em>This text is italic.</em> 

Hinweis

Sie müssen ein Sternchen finden, bevor und nach dem es kein anderes Sternchen gibt. Es wird nur nach vorne und nach vorne und hinten geschaut (der einfachste, aber nicht browserübergreifende).


Lösung

Ausdruck:


 /(^|[^*])\*([^*].*?[^*]|[^*])\*((?!\*)|$)/g 

Ersatz:


 $1<em>$2</em> 

Parsing-Lösung
  • "(^ | [^ *])" - Wir beginnen entweder am Zeilenanfang oder mit einem beliebigen Zeichen außer einem Sternchen. Die Gruppe muss dieses Symbol erfassen und vor das <em> -Tag setzen.
  • ((?! *) | $) - Wir werden entweder mit dem Ende der Zeile oder mit einem beliebigen Zeichen außer einem Stern enden, da hier spähen - das Leerzeichen nicht erfasst wird.
  • "([^ *]. *? [^ *] | [^ *])" - in der Mitte haben wir "[^ *]. *? [^ *]" Jeder Text, der nicht mit einem Stern und einem Ausdruck beginnen und enden soll oder "| [^ *]", nur um ein einzelnes Zeichen innerhalb des Tags zu berücksichtigen (es ist nicht erforderlich, den Test zu bestehen).

Aufgabe 5 - Zahlenformat


http://callumacrae.imtqy.com/regex-tuesday/challenge5.html


Wählen Sie aus der Liste der Zahlen nur Zahlen mit dem richtigen Format aus. Es ist allgemein anerkannt, Zahlen von rechts nach links zu schreiben, die in Gruppen von jeweils drei Ziffern unterteilt sind.


Beispiele für korrekt aufgezeichnete Nummern:


 1,024 8,205,500.4672 10.444444444444 30 000,7302 

Hinweis

Es ist wichtig zu beachten, dass die Zahlen genau von rechts nach links geschrieben sind und nicht umgekehrt. Dies bedeutet, dass eine Zahl mit 1-3 Ziffern beginnen kann und dann nur drei Ziffern in einer Gruppe sein können. Im nicht ganzzahligen Teil kann es so viele Zahlen geben, wie Sie möchten (oder überhaupt nicht). Berücksichtigen Sie, dass das Trennzeichen von Gruppen ein Komma oder ein Leerzeichen sein kann und das Trennzeichen des gesamten und eines nicht ganzzahligen Teils ein Komma oder ein Punkt sein kann.


Lösung

Ausdruck:


 /^\d{1,3}([ ,]\d{3})*([.,]\d+)?$/ 

Parsing-Lösung
  • "^ \ d {1,3}" - am Anfang von 1 bis 3 Ziffern.
  • "([,] \ d {3}) *" - neben einem Trennzeichen und einer Gruppe von 3 Zahlen zeigt ein Stern an, dass unser Format 0 oder mehrmals vorkommen kann.
  • "([.,] \ d +)? $" - Am Ende steht eine Gruppe mit einem Trennzeichen und einer Zahl. Das Fragezeichen ist ein Quantifizierer, der besagt, dass das Vorhandensein des nicht ganzzahligen Teils keine Voraussetzung ist.

Aufgabe 6 - IP-Adressen


http://callumacrae.imtqy.com/regex-tuesday/challenge6.html


Suchen Sie in der Liste der IP-Adressen in verschiedenen Formaten nach gültigen IP-Adressen. Vielleicht die trostloseste Aufgabe von allen. Nicht so sehr kompliziert, wie trostlos.


Beispiele für gültige IP-Adresseinträge und Erläuterungen:


  • 192.0.2.235 - dezimal mit Punkten.
  • 0300.0000.0002.0353 - Oktal mit Punkten.
  • 0xC0.0x00.0x02.0xEB - hexadezimal mit Punkten.
  • 0xC00002EC - hexadezimal.
  • 287454020 - dezimal.
  • 030000001353 - oktal.

Das Mischen verschiedener Formate ist schlecht. Besonders die Zahlen. Die Situation wird durch die Tatsache weiter kompliziert, dass die Formate von IP-Adressen mit Punkten gemischt werden können, zum Beispiel - 0xFF.255.0377.0x12. Persönlich bin ich der Meinung, dass dies eine schlechte Praxis ist, aber nach dem Test sind solche Optionen dennoch möglich und sollten daher berücksichtigt werden.


Hinweis
  • 192.0.2.235 - dezimal mit Punkten. Eine gemeinsame Notation kann aus 1 bis 3 Stellen zwischen Punkten (Werte von 0 bis 255) bestehen.
  • 0300.0000.0002.0353 - Oktal mit Punkten. 4 Stellen zwischen Punkten mit Werten von 0 bis 7.
  • 0xC0.0x00.0x02.0xEB - hexadezimal mit Punkten. Vier Zeichen zwischen Punkten. Führend "0x", dann zwei Zeichen (durch Ziffern oder von "a" bis "f").
  • 0xC00002EC - hexadezimal. Führend "0x", dann 8 Zeichen (Ziffernwerte oder von "a" bis "f").
  • 287454020 - dezimal. Beliebige Zahlen im Bereich von 0 bis 4294967295.
  • 030000001353 - oktal. Führende 0. Die Zahlen reichen von 0 bis 7. Der Bereich reicht von 0 bis 07777777777777.

Der reguläre Ausdruck wird großartig sein.


Lösung
 /^((((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])|(0x[\da-f]{2})|([0-7]{4}))\.){3}(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])|(0x[\da-f]{2})|([0-7]{4})))|(0x[\da-f]{8})|(0([0-7]{1,11}))|(2874540[2-8][0-9]|28745409[0-9]|287454[1-9][0-9]{2}|28745[5-9][0-9]{3}|2874[6-9][0-9]{4}|287[5-9][0-9]{5}|28[89][0-9]{6}|29[0-9]{7}|[3-9][0-9]{8}|[1-3][0-9]{9}|4[01][0-9]{8}|42[0-8][0-9]{7}|429[0-3][0-9]{6}|4294[0-8][0-9]{5}|42949[0-5][0-9]{4}|429496[0-6][0-9]{3}|4294967[01][0-9]{2}|42949672[0-8][0-9]|429496729[0-5]))$/i 

Parsing-Lösung

Für IP-Adressen mit Punkten ist das Mischen möglich, daher schreiben wir Optionen über "|" durch ein solches Muster: ((dezimal | hexadezimal | oktal).) {3} (dezimal | hexadezimal | oktal).


  • "(\ d | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0-5])" - für Dezimalzahl mit Aufzeichnungspunkt.
  • "(0x [\ da-f] {2})" - für hexadezimal mit einem Aufzeichnungspunkt.
  • "([0-7] {4})" - für Oktal mit einem Aufnahmepunkt.

Und andere Aufnahmeformate:


  • "(0x [\ da-f] {8})" - für hexadezimale Notation.
  • (2874540 [2-8] [0-9] | 28745409 [0-9] | 287454 [1-9] [0-9] {2} | 28745 [5-9] [0-9] {3} | 2874 [6-9] [0-9] {4} | 287 [5-9] [0-9] {5} | 28 [89] [0-9] {6} | 29 [0-9] {7} | [3-9] [0-9] {8} | [1-3] [0-9] {9} | 4 [01] [0-9] {8} | 42 [0-8 ] [0-9] {7} | 429 [0-3] [0-9] {6} | 4294 [0-8] [0-9] {5} | 42949 [0-5] [0-9 ] {4} | 429496 [0-6] [0-9] {3} | 4294967 [01] [0-9] {2} | 42949672 [0-8] [0-9] | 429496729 [0-5 ]) "- für Dezimalschreibweise. Und hier muss ich zugeben, dass ich für einen kürzeren Ausdruck betrogen habe, indem ich nur dezimale IP-Adressen in den Testbereich aufgenommen habe. Zum Guten müssen Sie hier alle Zahlen von 0 bis 4294967295 berücksichtigen. Das manuelle Schreiben ist keine dankbare Aufgabe, daher verwenden wir es .
  • (0 ([0-7] {1,11})) - für die oktale Notation.

Aufgabe 7 - URLs


http://callumacrae.imtqy.com/regex-tuesday/challenge7.html


Finden Sie aus der Liste der URLs gültig.


Beispiele für gültige Adressen:


 http://ab https://example.com/ http://test.this-test.com/ http://1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa 

Hinweis

Die Adresse muss unbedingt bei http: // oder https: // beginnen und mit einem Schrägstrich, einem Buchstaben (wenn es sich um eine Domain handelt) oder einer Zahl, wenn es sich um eine IP-Adresse handelt, enden. Jede Domain kann eine Subdomain haben. Gemäß dem Standard darf die Länge jeder Domäne 63 Zeichen nicht überschreiten mit einer Gesamtlänge von 255 Zeichen . Eine Domain, die in einer Subdomain verschachtelt ist begrenzt auf 127 Domains . Leider aktiviert die Regex-JavaScript-Engine diese Einschränkungen nicht vollständig, aber Sie können einen Ausdruck schreiben, der in etwa den Regeln entspricht, und den Test bestehen. Durchgestrichen, was durch Anpassen anderer Parameter umgangen werden kann.


Lösung
 /^https?:\/\/(((\b[az\d-]{1,63}\b)\.){1,40}(\b[az\d-]{1,63}\b))\/?$/i 

Parsing-Lösung
  • "^ https?: \ / \ /" - http: // oder https: //

Lassen Sie es uns separat analysieren ((\ b [az \ d -] {1,63} \ b).) {1,40}


  • "\ b" am Ende und am Anfang der Domain, um sicherzustellen, dass die Domain nicht startet und nicht mit etwas Ungültigem endet.
  • "[az \ d -] {1,63}" - Innerhalb des Domainnamens sind Buchstaben, Zahlen und Bindestriche zulässig
  • "{1.63}" - das sind nicht mehr als 63 Zeichen.
  • "((Domain-Name).) {1,40}" - Ich möchte hier 127 einfügen, aber in regulären Ausdrücken bedeutet der Quantifizierer {,} das Intervall der Wiederholung. Bei Verwendung von [] {} - dies ist die Anzahl der Zeichen, im Fall ohne [] - ist dies genau die Anzahl der Wiederholungen der Vorlage (Domänenname).). Daher beschränken wir die Wiederholung auf 40, um die allgemeine Längenbeschränkung nicht zu überschreiten, die auch wir aus diesem Grund nicht genau festlegen können.

Aufgabe 8 - Elemente wiederholen


http://callumacrae.imtqy.com/regex-tuesday/challenge8.html


Die Aufgabe ist Aufgabe 1 in vielerlei Hinsicht sehr ähnlich, aber hier müssen Sie die wiederholten Elemente der MarkDown-Liste mit zwei Sternen finden und hervorheben.


Eine solche Liste:


 * Repeated list item * Repeated list item 

Muss dazu konvertiert werden:


 * Repeated list item * **Repeated list item** 

Hinweis

Wir verwenden einen Backlink, ein Zeilenvorschubzeichen, globale, mehrzeilige und unempfindliche Schlüssel.


Lösung

Ausdruck:


 /^(\*\s+([^\n]+)\n\*\s+)(\2)$/gmi 

Ersatz:


 $1**$3** 

Aufgabe 9 - MarkDown-Links


http://callumacrae.imtqy.com/regex-tuesday/challenge9.html


Ersetzen Sie gültige MarkDown-Links durch HTML-Links.


Konvertierungsbeispiel:


 [Another](http://example.com/) -> <a href="http://example.com/">Another</a> 

Hinweis

Dies kann ohne Gucken oder mit Blick nach vorne geschehen. Anstatt zurückzublicken, ist es ein Ersatz.


Lösung

Ausdruck:


 /(^|\s+)\[([^\]\[]+)\]\s*\((https?:\/\/\b[az\d-]+\b(\.[az-]+)*\.\w+\/*)\)(?=$|\s+)/i 

Ersatz:


 $1<a href="$3">$2</a> 

Parsing-Lösung
  • "(^ | \ s +)" - Vor dem MarkDown-Link ist entweder der Zeilenanfang oder ein Leerzeichen zulässig. Wir nehmen dies in die Gruppe auf, um den erfassten Platz durch den Ersatz von 1 US-Dollar zu ersetzen.
  • "[([^] [] +)] \ s *" - Alle anderen Zeichen als quadratische Anführungszeichen sind in der Kopfzeile zulässig.
  • "(https?: \ / \ / \ b [az \ d -] + \ b (. [az -] +) . \ w + \ / )" - Wir überprüfen, ob die URL-Adresse gültig ist.
  • "(? = $ | \ s +)" - am Ende entweder ein Leerzeichen oder das Ende einer Zeile.

Aufgabe 10 - Schlüsselwörter


http://callumacrae.imtqy.com/regex-tuesday/challenge10.html


Die härteste Herausforderung von allen. Verwandeln Sie vorhandenen Text mithilfe von regulären Ausdrücken mit Ersetzungen in durch Kommas getrennte Schlüsselwörter.


Regeln:


  • Anführungszeichen sind ein Schlüsselwort.
  • Mit Bindestrichen versehene Namen sind ein Schlüsselwort.
  • Das Wort kann ein Apostroph enthalten.
  • Symbole (; - '") müssen entfernt werden.

Ein Beispiel ist folgendes:


Sag Suzie Smith-Hopper nicht, dass ich Daniels Spielzeugpferd kaputt gemacht habe


Sollte dazu konvertiert werden:


Sag nicht, Suzie, Smith-Hopper, dass ich, Daniels, Spielzeug, Pferd, kaputt gegangen bin


Es klingt auf den ersten Blick nicht kompliziert, ist es aber nicht. Tatsache ist, dass ein solches Problem nicht gelöst und nicht mit nur einem regulären Ausdruck mit Ersatz in die endgültige Form gebracht wird. Testfälle sind jedoch so konzipiert, dass die Lösung des Problems dennoch möglich ist.


Hinweis

Es muss entschieden werden, wo ein Komma eingefügt werden soll, was neben diesem Komma eingesetzt werden soll und auf welcher Seite. Das Problem geht von einer Annahme aus - das erste Wort in jedem Testfall erfordert keine Änderungen. Dies bedeutet, dass Sie bis auf das erste Wort ein Komma links vom ersetzten Wort setzen müssen.


Lösung

Ausdruck:


 /\s(['"])([^'"]+)\1|(;? |['"]? | ['"]|-{2,})(\w+)/g 

Ersatz:


 ,$2$4 

Parsing-Lösung

Da wir uns bereits für die Stelle entschieden haben, an der das Komma eingefügt werden soll, entscheiden wir, durch was wir dieses Komma ersetzen und was gelöscht werden soll.


  • "\ s (['"]) ([^' "] +)" - Ersetzen Sie die Vorlage {Leerzeichen "des Wortes durch ein Leerzeichen in Anführungszeichen"} durch {, Wörter mit einem Leerzeichen} . "\ s" ist hier nicht nur so, sondern um falsche Vorkommen mit falsch platzierten Anführungszeichen auszuschließen.
  • "(;? | ['"]? | [' "] | - {2,}) (\ w +)" - dann gibt es einzelne Wörter, denen vorangestellte Zeichen stehen, die gelöscht werden müssen, und ein Komma vor diesen Wörtern.

Source: https://habr.com/ru/post/de474184/


All Articles