Notepad ++ komplexe Mustersuche

648
Pmicezjk

Hallo, ich bin auf der Suche nach einem Notepad ++ Regex-Muster in einem Text und bringe einige Ersetzungen mit. Aber bis jetzt scheint das, was ich mir ausgedacht habe, nicht zu funktionieren.

Beispieltext:

1 blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala. 2 blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl. 3 blalblblbl: blablaa; balal blala. 4 blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl. 5 jsjjsjj; gggbqbqbq: ghshhqhhqh !. Gsgsjjsskksk. 6 fshhhshs, nnsnnsns! nsnnsn. 7 blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm : blslslslsavccacac, hkkdlfmfmmf56balalala. hdfmmfm87kdkkkkfkf. 8 blalalallajhshduie. 9 bslslslslls : blslsllsllls, bslslllsllsls. nsnsnnsnsnnsnns, hsbbbslslsllsllsls. 10 bslsllsllsllsllslls à sbsbbsbbsb, snsnnsnnsnnsn. 

Mustersuche:
Ich suche nach dem Anfang einer beliebigen Nummer, gefolgt von einem Leerzeichen und einigen Texten und stoppt, bevor die nächste Nummer vor einem Leerzeichen gefunden wird.

Die Gruppierung sollte folgendermaßen aussehen:

  • Gruppe 1: eine Zahl
  • Gruppe 2: Das Leerzeichen nach der Nummer
  • Gruppe 3: Text, der auch Zahlen enthalten kann. Diese Zahlen stehen jedoch nicht zwischen Leerzeichen, sondern zwischen (µµ).

Erwartete Ergebnisse:

<VERSETAG=1>blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala.</VERSETAG> <VERSETAG=2> blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl.</VERSETAG> <VERSETAG=3>blalblblbl: blablaa; balal blala.</VERSETAG> <VERSETAG=4>blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl.</VERSETAG> <VERSETAG=5>jsjjsjj; gggbqbqbq: ghshhqhhqh !. Gsgsjjsskksk.</VERSETAG> <VERSETAG=6>fshhhshs, nnsnnsns! nsnnsn.</VERSETAG> <VERSETAG=7>blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm : blslslslsavccacac, hkkdlfmfmmf56balalala. hdfmmfm87kdkkkkfkf.</VERSETAG> <VERSETAG=8>blalalallajhshduie.</VERSETAG> <VERSETAG=9>bslslslslls :</VERSETAG> <VERSETAG=10>bslsllsllsllsllslls à sbsbbsbbsb, snsnnsnnsnnsn.</VERSETAG> 

Getestet mit dieser Regex dank @Toto (funktioniert aber bisher nicht wie erwartet, siehe Ergebnis unten):

Look for : (?:^\D*|\G )(\d+)\s+(.+?)\R?(?=\s\d+\s|\z)   replace with : <VERSETAG=$1>$2</VERSETAG>\n 

Ergebnis des Tests:

<VERSETAG=1>blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala.</VERSETAG> 2 blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl. <VERSETAG=3>blalblblbl: blablaa; balal blala.</VERSETAG> <VERSETAG=4>blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl.</VERSETAG> <VERSETAG=5>jsjjsjj; gggbqbqbq: ghshhqhhqh !. Gsgsjjsskksk.</VERSETAG> <VERSETAG=6>fshhhshs, nnsnnsns! nsnnsn.</VERSETAG> 7 blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm : blslslslsavccacac, hkkdlfmfmmf56balalala. hdfmmfm87kdkkkkfkf. 8 blalalallajhshduie. 9 bslslslslls : <VERSETAG=10>bslsllsllsllsllslls à sbsbbsbbsb, snsnnsnnsnnsn.</VERSETAG> 

Vielen Dank im Voraus!

3
Könnten Sie uns in Worten sagen, was Ihr Muster erreichen soll? harrymc vor 5 Jahren 0
Hallo, Wie im erwarteten Ergebnis beschrieben: Wenn eine Zahl gefunden wird, auf die ein Leerzeichen folgt, sollte dort ein Tag mit dieser Nummer in das Zeichen () und bevor Sie auf die nächste Zahl gefolgt von einem Leerzeichen stoßen, sollte das schließende Tag eingefügt werden. () Pmicezjk vor 5 Jahren 0
Ich renne gerade mit Ihrem neuen Testfall, es funktioniert ziemlich gut. Haben Sie überprüft `. passt newline`? Toto vor 5 Jahren 0
Ja Tatsächlich funktioniert das jetzt perfekt !! Genial ! Tolle Hilfe ! Pmicezjk vor 5 Jahren 0

1 Antwort auf die Frage

2
Toto

Update gemäß den Kommentaren:

  • Ctrl+H
  • Finde was: (?:^\D*|\G )(\d+)\s+(.+?)\R?(?=\s\d+\s|\z)
  • Ersetzen mit: <VERSETAG=$1>$2</VERSETAG>\n
  • Aktivieren Sie die Option Wrap around
  • Überprüfen Sie den regulären Ausdruck
  • PRÜFEN . matches newline
  • Replace all

Erläuterung:

(?:^\D*|\G ) # non capture group, beginning of line followed by 0 or more non digits or restart from the last match position (\d+) # group 1, 1 or more digits \s+ # 1 or more spaces (.+?) # group 2, 1 or more any character including new line, not greedy \R? # any kind of linebreak, optional (?=\s\d+\s|\z) # positive lookahead, make sure we have after 1 or more digits surround with spaces or end of file 

Ergebnis für gegebenes Beispiel:

<VERSETAG=1>blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala.</VERSETAG> <VERSETAG=2>blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl.</VERSETAG> <VERSETAG=3>blalblblbl: blablaa; balal blala.</VERSETAG> <VERSETAG=4>blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl.</VERSETAG> <VERSETAG=5>jsjjsjj; gggbqbqbq: ghshhqhhqh !. Gsgsjjsskksk.</VERSETAG> <VERSETAG=6>fshhhshs, nnsnnsns! nsnnsn.</VERSETAG> <VERSETAG=7>blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm: blslslslsavccacac, hkkdlfmfmmf56balalala. hdfmmfm87kdkkkkfkf.</VERSETAG> <VERSETAG=8>blalalallajhshduie.</VERSETAG> 

Bildschirmaufnahme anfertigen

enter image description here

** Super Toto! Wir sind fast da! aber es scheint nicht zu funktionieren, wenn die Zeile mit einigen Texten beginnt: ** `Zum Beispiel funktioniert das followin nicht:` `1 blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala. 2blblb'blbµµ77777µµlblb blblb, blslsµµ105µµllsllsl. 3 blalblblbl: blablaa; balal blala. 4 blblb'blbµµ9999µµlblb. Blblb, blslsnlsllsl. 5 jsjjsjj; gggbqbqbq: ghshhqhhqh!. Gsgsjjsskksk. 6 fshhhshs, nnsnnsns! nsnnsn. dlflflf4532llflflf, vjjsjsjss8776nndndn54; qcqaataab. 7 hhhshhshshshshshshhs, bslslslsllslsllsll.` Pmicezjk vor 5 Jahren 0
@Pmicezjk: Ersetzen Sie einfach `(?: ^ | \ G)` durch `(?: ^ \ D * | \ G)` am Anfang der Regex. Siehe meine Bearbeitung. Toto vor 5 Jahren 0
`Arbeitet immer noch nicht dazwischen (siehe Versetag 7 und 8). Das habe ich, wenn ich (?: ^ | \ G) durch (?: ^ \ D * | \ G) `:` ersetzeblalallal7600hhzhz; nmmkzjzbzbzb34fspmmm: blslslslsavccacac, hkkdlfmfmmf56balalala. hdfmmfm87kdkkkkfkf. blalalallajhshduie.` Pmicezjk vor 5 Jahren 0
Ich habe genau das getan, was Sie gesagt haben: Ersetzen Sie (?: ^ | \ G) einfach durch (?: ^ \ D * | \ G). In einem Beispieltext habe ich keine Tags, wenn die Zeilen mit einigen Texten beginnen. Im anderen Beispieltext habe ich die Zeile, die mit einem vollständig entfernten Text beginnt. Pmicezjk vor 5 Jahren 0
@Pmicezjk: Ich habe die Regex vollständig neu geschrieben und nicht einfach `\ D *` hinzugefügt Toto vor 5 Jahren 1
Ich habe das letzte Mittel ausprobiert: `` Find what: (?: ^ \ D * | \ G) (\ d +) \ s + (. +?) \ R? (? = \ S \ d + \ s | \ z ) `` Ersetzen durch: $ 2 \ n` `Einige Zeilen, die mit Zahlen beginnen, funktionieren jedoch nicht mehr wie zuvor! Und es ist nicht besser, wenn die Zeilen mit etwas Text beginnen. ` Pmicezjk vor 5 Jahren 0
@Pmicezjk: Sorry, ich verstehe dich nicht, es scheint für mich zu funktionieren. Haben Sie überprüft `. passt newline`? Bitte [bearbeiten Sie Ihre Frage] (https://superuser.com/posts/1374975/edit) und fügen Sie einige Eingabezeilen hinzu, die für Sie nicht geeignet sind. Toto vor 5 Jahren 1
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (https://chat.stackexchange.com/rooms/85708/discussion-between-pmicezjk-and-toto). Pmicezjk vor 5 Jahren 0
@Pmicezjk: Fühlen Sie sich frei, die Antwort als akzeptiert anzukreuzen, siehe: https://superuser.com/help/someone-answers Toto vor 5 Jahren 0