usando regex per trovare parentesi quadreHo un cliente che desidera estrarre i numeri per i limiti delle specifiche. Può farlo quando il testo usa le parentesi ma non per le parentesi quadre.Poiché le parentesi quadre, "[" e "]", sono caratteri regex speciali, ho pensato che l'uso del carattere di escape "\" o "\\" sarebbe stato d'aiuto, ma non sono riuscito a farlo funzionare.
Il testo che sta cercando potrebbe essere simile a [0.080, 1.20] e desidera utilizzare l'espressione regolare per ottenere 0.080 e 1.2.
La sua formula attuale per trovare le parentesi sinistre, "(" nel testo è simile a questa:
Regex( :Testo, "((?<=\().+(?=\,))" )
Per le parentesi chiuse, ")", usa
Regex( :Testo, "((?<=\,).+(?=\)))" )
Come si possono modificare queste formule per trovare "[" o "]"?
Dopo averlo ottenuto, vorrebbe anche essere in grado di trovare "<", ">", "+", "-" e "+/-".
Qualsiasi aiuto sarebbe apprezzato.
Grazie!
Re: usare regex per trovare le parentesi quadreQuesto mi fa sempre inciampare perché \[ è la sequenza di escape per delimitare una stringa. Se lo sfuggi prima, puoi usarlo per indicare un metacarattere regex
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)", "\1" ) )
per il primo numero
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)\s*,([0-9\.eE\+\-]+)", "\2" ) )
per il secondo.
Re: usare regex per trovare le parentesi quadreCiao Charlie,
Hai un'idea di come sarà il testo? Il cliente potrebbe anche non aver bisogno di espressioni regolari. Nelle impostazioni in cui questo è il caso, il JSL risultante è spesso molto più facile da implementare e mantenere.
Per esempio:
Names Default To Here(1);
text = "this is a bunch of text with some data in it between brackets [2.3, 4.5] like so.";
specTxt = word(2, text, "[]");
specLo = num(word(1, specTxt, ","));
specHi = num(word(2, specTxt, ","));
show(specLo, specHi);
Re: usare regex per trovare le parentesi quadreMa perché usare un martello a punta quando una mazza da 16 libbre fa un botto più grande?
Re: using regex to find square bracketsHa! So true.
Re: usare regex per trovare le parentesi quadreQuesta è un'ottima domanda per l'utente da postare su Discussioni board per vedere la velocità e la qualità delle risposte che riceveranno dalla più ampia comunità di utenti di JMP.
Personalmente, non ho mai imparato Regex, quindi mi affido a Funzioni di carattere per la maggior parte della manipolazione delle stringhe. In particolare la funzione Word() fa miracoli per me.
Se impari solo una funzione dell'editor di formule, Word () è quella
Re: usare regex per trovare le parentesi quadreQuesta è una grande idea. Sarei anche curioso di vedere quanto spesso le persone fanno quello che ho fatto io, rispondono direttamente alla domanda, piuttosto che pensare a ciò che l'utente sta cercando di fare, per trovare una soluzione semplice e più elegante. È sempre meglio capire di cosa ha bisogno l'utente e non necessariamente cosa vuole.
Re: usare regex per trovare le parentesi quadreEcco un altro esempio di come potrebbe essere utilizzata una regex.
Names Default to Here( 1 );
// source
string = "My spec limits are [0.080,1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" ) );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Re: usare regex per trovare le parentesi quadreGrazie Brady!Ho provato la tua soluzione e funziona.Mi piace la semplicità.C'è un modo per cercare una parola per "[" o per "("?Penso che sia più vicino a ciò che il cliente sta cercando.
grazie ancora!
Charlie
Re: usare regex per trovare le parentesi quadreGrazie Don!La tua soluzione funziona per parentesi quadre.C'è un modo per farlo cercare "(" o "[" in modo che funzioni in entrambi i casi?
Grazie!
Charlie
Re: usare regex per trovare le parentesi quadreSegno-
Ho avuto qualche problema a far funzionare la tua soluzione.Ho allegato una tabella di dati di esempio.Potresti dare un'occhiata e farmi sapere cosa sto facendo male?
Grazie,
Charlie
Re: usare regex per trovare le parentesi quadreGrazie Jeff.Non conosco affatto le espressioni regolari e provo anche a utilizzare le funzioni dei caratteri.Tuttavia, volevo rispondere alla domanda del cliente utilizzando una tecnica molto simile al modo in cui lo stava facendo in modo che potesse applicarla facilmente.
L'ho incoraggiato a pubblicarlo sulla community.Vedremo cosa succede.
Grazie!
Charlie
Re: usare regex per trovare le parentesi quadreCiao Charlie,
La funzione word() ha 3 argomenti, l'ultimo dei quali, il set di delimitatori, è facoltativo. Questa è una stringa tra virgolette che contiene tutti i delimitatori che vuoi considerare. Quindi l'utente inserirà parentesi e parentesi in questa stringa.
Per vedere come word() scompone una funzione, può essere utile esaminare cosa viene restituito dalla funzione words(). Words() restituisce un elenco di tutti i frammenti di testo, dopo la delimitazione.
Per esempio:
la parola (2, "Hit the road jack") restituisce "the".
word(2, "Hit the road jack", "") restituisce "i", perché la stringa vuota viene utilizzata quando si desidera suddividere il testo in singoli caratteri.
word(1, "abc/def[ghi]klm", "[]()") restituisce "abc/def"... se guardi le parole( "abc/def[ghi]klm", "[]()" ), otterrai
{ "abc/def", "ghi", "klm" } come risultato.
Spero che questo ti aiuti.
Saluti,
Brady
Ri: utilizzo di espressioni regolari per trovare parentesi quadreSe vuoi davvero usare Regex, la seguente stringa può essere usata per superiore o inferiore
"[\!\[|\(]([0-9\.eE\+\-]+)\s*,\s*([0-9\.eE\+\-]+)"
l'unica differenza sarà il secondo argomento, "\1" per il minore e "\2" per il superiore. Per capire cosa sta succedendo, pensa all'espressione suddivisa in quattro parti
[\!\[|\(]
[a|b] corrisponderà a o b, sia le parentesi quadre che le parentesi sono caratteri speciali, quindi devono essere sfuggiti usando la barra rovesciata. Poiché anche la sequenza \[ è speciale in JSL, richiede il ! per indicare che non è una sequenza speciale.
([0-9\.eE\+\-]+)
Le parentesi catturano l'espressione in essa contenuta. Questo è ciò a cui si riferisce \1. Ancora una volta, le parentesi quadre vengono utilizzate per designare un set di caratteri. In questo caso è uno o più (a causa del + alla fine) di un numero, punto (carattere speciale sfuggito), più (idem), meno (idem), E minuscola o maiuscola. Se ci sono caratteri che ho dimenticato che possono essere usati per indicare un numero, inseriscili qui.
\s*,\s*
zero o più spazi, una virgola, zero o più spazi
([0-9\.eE\+\-]+)
Stessa espressione del primo catturato. È referenziato da \2. La cosa bella è che, una volta arrivato fin qui, puoi fermarti. Non c'è bisogno di catturare la parentesi o la parentesi di chiusura (per quanto ne so). Potresti se lo volessi.
Detto questo, userei la soluzione di Brady. È più succinto e più facile da capire. Dovrai aggiungere la virgola nel set di delimitatori, ad es.
"[(,])"
Re: usare regex per trovare le parentesi quadreIl tuo esempio precedente non includeva uno spazio dopo la virgola. Ecco l'esempio di script corretto:
Names Default to Here( 1 );
// source 1
string = "My spec limits are [0.080, 1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
// source 2
string = "My spec limits are (0.080, 1.20) for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
Ho allegato la tua tabella dati con le formule corrette.
Re: usare regex per trovare le parentesi quadreQuesto è un buon esempio di come Regex possa essere complicato da implementare, senza una buona comprensione dei dati sottostanti. La presenza/assenza di uno spazio ha fatto la differenza.
Supponiamo ora che debba essere supportato qualsiasi formato numerico legittimo. In questo caso il Regex diventerebbe più brutto, perché dovresti tenere conto della notazione scientifica, dei negativi, dei punti (o meno), ecc.
In tali casi, una combinazione di funzioni JSL e Regex può portare a termine il lavoro più facilmente rispetto a entrambe le sole.
Ad esempio, nel seguente JSL:
1) Sostituisci cambia parentesi e parentesi in parentesi graffe (l'operatore lista... importante al punto 3)
2) Regex afferra le parentesi graffe e ciò che contengono, presunto essere una coppia di numeri legittimi in qualsiasi formato
3) Parse converte la stringa restituita da Regex in un'espressione JSL che assegna il contenuto della lista a specLo e specHi.
txt = "My spec limits are [-4.087e-3, 1.20] for this CQA.";
{specLo, specHi} = Parse( Regex( Substitute( txt, "(", "{", "[", "{", ")", "}", "]", "}" ), "\\!{.*\\!}" ) );
- Brady
Re: usare regex per trovare le parentesi quadreGrazie per l'aiuto!