Aiuto Regex -ciao, ho solo bisogno di aiuto per usare la funzione Regex --
La stringa è come --
"Fine.2020.Facoltativo.(Non)"
Obbligatorio - "Fine_2020_Optional"
Ho provato un paio di combinazioni, ma non sono riuscito a ottenere il risultato in una regex. Sto usando questo tipo di Regex nel mio script for loop.
Qualsiasi aiuto ?
Grazie.
Ri: Aiuto Regex -Grazie. Questo è molto utileRi: Aiuto Regex -@Craige_Hales Complimenti x 10^6
Grazie
Ri: Aiuto Regex -CIAO @Byron_JMP !
Potrei farlo in questo modo:
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);risultato = "Fine_2020_Optional_more_last";
È piuttosto lungo e piuttosto opaco (forse non così opaco come le espressioni regolari). Ma...
- Regex() è in realtà mirato a effettuare più sostituzioni; GLOBALREPLACE viene eseguito in modo efficiente. Probabilmente avrai bisogno di una seconda espressione regolare da rimuovere ( testo ), utilizzando anche GLOBALREPLACE se può essercene più di uno.
- Anche Word(), nell'esempio di Jeff, è buono se sai quanti conservarne e dove appare il (testo). . Non puoi batterlo per semplicità, manutenibilità e forse anche per velocità.
- PatMatch() brilla altrove; serve davvero per estrarre informazioni o al massimo per inserire una stringa in un'unica posizione (non esiste GLOBALREPLACE). L'esempio mostra PatMatch() che estrae informazioni per creare un elenco di parti, quindi riassembla le parti.
D'altra parte, questa è un'ottima introduzione su come utilizzare la corrispondenza dei modelli per estrarre informazioni da una stringa. Il vero vantaggio deriva da stringhe più lunghe che possono essere analizzate in una singola corrispondenza (come sopra, su una stringa breve) perché la corrispondenza ha un sovraccarico di avvio solo una volta. Facendo in modo che PatRepeat percorra la stringa in un unico passaggio e non modificando la stringa, la corrispondenza può essere piuttosto veloce.
Ri: Aiuto Regex -Anche la corrispondenza del modello potrebbe essere una buona soluzione, ma continuo a inciampare nella sintassi. Se solo ci fosse qualcuno in giro che parla fluentemente snbol... @Craige_Hales
Ri: Aiuto Regex -Non dimenticare le funzioni JMP integrate per eseguire la manipolazione delle stringhe, come Sostituire() , Munger() E, il mio preferito , Parola() . La sintassi per questi potrebbe essere più semplice da gestire per qualcosa di simile.
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], "_"));
Tronco d'albero:
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";
Ri: Aiuto Regex -OK, quindi offline ho ricevuto un paio di commenti sulla soluzione molto breve.
Ecco come arrivarci da solo. Potrebbe essere un imbroglio, ma è tremendamente molto più semplice.
Ho creato una tabella con l'esempio al suo interno. Selezionata la colonna e utilizzata la ricodifica.
In Recode ho usato la sostituzione della stringa e ho attivato le espressioni regolari.
Nella finestra di dialogo di ricodifica ho attivato entrambe le opzioni di scripting (in basso a destra)
Quindi ho salvato lo script nella finestra dello script, ho copiato una piccola parte e l'ho incollato qui. (beh, ho verificato che funzionasse e poi l'ho incollato.)
Enorme grazie a @ErnestPasour 


oh, e c'è quel pezzettino che usa "\." piuttosto che "." solo. La barra rovesciata è un carattere di escape e impedisce di sostituire tutto con "_". Questa è l'unica conoscenza delle espressioni regolari necessaria per far funzionare il tutto.
Ri: Aiuto Regex -Regex ( "questo.è.jmp" , "\." , "_" , SOSTITUZIONE GLOBALE );
Ri: Aiuto Regex -Questo è davvero molto utile. Grazie.
Ri: Aiuto Regex -Questo sito Web contiene alcune ottime informazioni generali su Regex:
https://www.regular-expressions.info/quickstart.html
C'è anche uno strumento per generare un'espressione regolare basata sugli input e sugli output attesi:
http://regex.inginf.units.it/
Ri: Aiuto Regex -Grazie Paolo,
Ce ne sono pochi più semplici, sono riuscito a farlo ma questo era quello giusto. il che mi ha dato qualche problema. La prossima volta, se riscontrerò qualche problema, ti ricontatterò con maggiori dettagli. Hai qualche riferimento/link da condividere con me/noi su Regex con buoni esempi? Questo sarebbe molto utile.
Grazie ancora.Ri: Aiuto Regex -Probabilmente sarebbe d'aiuto se avessimo più esempi di input e output attesi e dove rimani bloccato. Il JSL riportato di seguito funziona per il tuo singolo caso, ma non sono sicuro che sia applicabile a tutti i tuoi dati in generale.
Regex("Fine.2020.Optional.(Not)",
"(\w+?)\.(\d+?)\.(\w+?)\.\(\w+?\)",
"\1_\2_\3"
);