Regex-Hilfe -Hallo, ich brauche nur etwas Hilfe bei der Verwendung der Regex-Funktion –
String ist wie –
„Gut.2020.Optional.(Nicht)“
Erforderlich – „Fine_2020_Optional“
Ich habe einige Kombinationen ausprobiert, konnte aber das Ergebnis nicht in einem regulären Ausdruck erzielen. Ich verwende diese Art von Regex in meinem for-Schleifenskript.
Irgendeine Hilfe ?
Danke.
Betreff: Regex-Hilfe -Danke. Das ist sehr hilfreichBetreff: Regex-Hilfe -@Craige_Hales Kudo x 10^6
Danke
Betreff: Regex-Hilfe -Hallo @Byron_JMP !
Ich könnte es so machen:
source = "(aaa).Fine.2020.Optional.(Not).more.(leave out).last.(bbb)";
//
// remove text between parens, change . to _
//
parts = {}; // accumulator list of the individual parts
ipart = 0; // index to the parts list
rc = Pat Match( // test the rc (below) to make sure the match worked
source,
patpos(0) // PatRepeat must start at the beginning.
+
Pat Repeat(
( "." | Pat Pos( 0 ) ) // advance past a required period, or begin of string
+ // followed by either...
(
( "(" + Pat Break( ")" ) + ")" )
// above: match open paren and stop on a close paren. Parens and everything
// between is rejected by not adding anything to the list of parts.
| // or
( ( Pat Break( "." ) | Pat Rem() ) >> parts[ipart += 1] )
// above: scan forward up to, but not including, a period, or if
// that doesn't work, to the end (remainder) of the string.
// ipart += 1 adds 1 before subscripting. It is OK to add an item
// to a list just beyond the end of the list. The >> operator stores
// the matched value on its left into the variable on its right.
)
)
+
patrpos(0) // PatRepeat must stop at the end.
);
// re-join the parts with the _ separator
result = if(rc,Concat Items( parts, "_" ),"problem with match");
show(result);result = "Fine_2020_Optional_more_last";
Es ist ziemlich lang und ziemlich undurchsichtig (vielleicht nicht so undurchsichtig wie Regex). Aber...
- Regex() zielt eigentlich darauf ab, mehrere Ersetzungen vorzunehmen; GLOBALREPLACE wird effizient durchgeführt. Sie benötigen wahrscheinlich einen zweiten regulären Ausdruck, um ( Text ), auch GLOBALREPLACE verwenden, wenn es mehrere geben kann.
- Word() ist in Jeffs Beispiel auch gut wenn Sie wissen, wie viele Sie aufbewahren müssen und wo der (Text) erscheint . Es ist unschlagbar an Einfachheit und Wartbarkeit und vielleicht auch an Geschwindigkeit.
- PatMatch() glänzt anderswo; Es dient eigentlich dazu, Informationen zu extrahieren oder höchstens eine Zeichenfolge an einem einzelnen Ort zu speichern (es gibt kein GLOBALREPLACE). Das Beispiel zeigt, wie PatMatch() Informationen extrahiert, um eine Liste von Teilen zu erstellen, und die Teile dann wieder zusammensetzt.
Andererseits ist dies eine großartige Einführung in die Verwendung des Mustervergleichs zum Extrahieren von Informationen aus einer Zeichenfolge. Der eigentliche Vorteil ergibt sich aus längeren Zeichenfolgen, die in einem einzigen Match geparst werden können (wie oben bei einem kurzen String), da der Match nur einmal einen Startoverhead verursacht. Indem PatRepeat die Zeichenfolge in einem Durchgang durchläuft und die Zeichenfolge nicht verändert wird, kann die Übereinstimmung ziemlich schnell erfolgen.
Betreff: Regex-Hilfe -Mustervergleich könnte auch eine gute Lösung sein, aber ich stolpere immer wieder über die Syntax. Wenn nur jemand in der Nähe wäre, der fließend Snbol spricht ... @Craige_Hales
Betreff: Regex-Hilfe -Vergessen Sie nicht die integrierten JMP-Funktionen zur String-Manipulation, z Ersatz() , Munger() Und, mein Favorit , Wort() . Die Syntax dafür könnte für so etwas einfacher zu handhaben sein.
str="Fine.2020.Optional.(Not)";
show(substitute(str, ".", "_"));
show(word(1, str, ".") || "_" || word(2, str, ".") || "_" || word(3, str, "."));
show(concat items(words(str, ".")[1::3], "_"));
Protokoll:
Substitute(str, ".", "_") = "Fine_2020_Optional_(Not)";
Word(1, str, ".") || "_" || Word(2, str, ".") || "_" || Word(3, str, ".") = "Fine_2020_Optional";
Concat Items(Words(str, ".")[Index(1, 3)], "_") = "Fine_2020_Optional";
Betreff: Regex-Hilfe -OK, offline habe ich ein paar Kommentare zu der sehr kurzen Lösung erhalten.
Hier erfahren Sie, wie Sie auf eigene Faust dorthin gelangen. Es mag Betrug sein, aber es ist soooooo viel einfacher.
Ich habe eine Tabelle mit dem Beispiel erstellt. Die Spalte ausgewählt und Neucodierung verwendet.
In Recode habe ich „String ersetzen“ verwendet und die regulären Ausdrücke aktiviert.
Im Neukodierungsdialog habe ich beide Skriptoptionen aktiviert (unten rechts).
Dann habe ich das Skript im Skriptfenster gespeichert, einen kleinen Teil kopiert und hier eingefügt. (Nun, ich habe überprüft, ob es funktioniert, und es dann eingefügt.)
Vielen Dank an @ErnestPasour : )


Oh, und da ist noch das kleine bisschen, bei dem „\“ verwendet wird. statt "." allein. Der Backslash ist ein Escape-Zeichen und verhindert, dass alles durch „_“ ersetzt wird. Das ist das einzige bisschen Regex-Wissen, das nötig ist, damit dies funktioniert.
Betreff: Regex-Hilfe -Regex ( „this.is.jmp“ , „\.“ , „_“ , GLOBALREPLACE );
Betreff: Regex-Hilfe -Das ist wirklich sehr hilfreich. Danke.
Betreff: Regex-Hilfe -Auf dieser Website finden Sie einige großartige allgemeine Informationen zu Regex:
https://www.regular-expressions.info/quickstart.html
Es gibt auch ein Tool zum Generieren eines regulären Ausdrucks basierend auf Ihren Eingaben und erwarteten Ausgaben:
http://regex.inginf.units.it/
Betreff: Regex-Hilfe -Danke Paul,
Es gibt nur wenige einfachere, ich habe es geschafft, aber das war das Richtige. was mir einige Schwierigkeiten bereitete. Wenn ich das nächste Mal ein Problem finde, melde ich mich mit weiteren Einzelheiten bei Ihnen. Haben Sie eine Referenz/einen Link mit guten Beispielen, den Sie mit mir/uns zu Regex teilen können? Das wäre sehr hilfreich.
Danke noch einmal.Betreff: Regex-Hilfe -Es würde wahrscheinlich helfen, wenn wir mehr Beispiele für Eingaben und erwartete Ausgaben hätten und wo Sie hängen bleiben. Die folgende JSL funktioniert für Ihren Einzelfall, ich bin mir jedoch nicht sicher, ob sie allgemein auf alle Ihre Daten anwendbar ist.
Regex("Fine.2020.Optional.(Not)",
"(\w+?)\.(\d+?)\.(\w+?)\.\(\w+?\)",
"\1_\2_\3"
);