Regex: Es können nicht alle übereinstimmenden Teile der Zeichenfolge abgerufen werdenIch versuche, alle übereinstimmenden Teile der Zeichenfolge zu extrahieren, verwende aber Regex-Match und kann die gewünschten „BWA005, BWAZ006“ nicht abrufen.
ex="Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
Regex match( ex, "[\!"](BWA|BWAZ|BWAZ_)([0-9]{1,})(.*?)[\!"]" )
Automatisierung und SkripterstellungMac OSBetreff: Regex: Es können nicht alle übereinstimmenden Teile der Zeichenfolge abgerufen werdenIch bin mir sicher, dass dies nicht die beste Lösung ist, aber Regex Match() scheint nicht das zu tun, was ich möchte, wie re.findall in Python. Mit diesem groben Skript können Sie eine Liste aller Übereinstimmungen erhalten. Hoffentlich kennt jemand einen besseren Weg.
Names Default To Here( 1 );
ex = "Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
matchlist = {};
While( !Is Missing( Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" ) ),
a = Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" );
Insert Into( matchlist, a );
Substitute Into( ex, a, "" );
);
Betreff: Regex: Es können nicht alle übereinstimmenden Teile der Zeichenfolge abgerufen werdenFalls es dort tatsächlich Duplikate gibt, die Sie sehen möchten, etwa { „BWA005“, „BWAZ006“, „BWA005“ }, sollten Sie es stattdessen folgendermaßen machen:
Names Default To Here( 1 );
ex = "Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
matchlist = {};
While( !Is Missing( Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" ) ),
a = Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" );
Insert Into( matchlist, a );
b = Contains( ex, a );
c = Length( a );
ex = Substr( ex, b + c );
);Betreff: Regex: Es können nicht alle übereinstimmenden Teile der Zeichenfolge abgerufen werdenDanke ! Es klappt!
Ich möchte wissen, ob es einen besseren Weg gibt, dies zu tun.
Betreff: Regex: Es können nicht alle übereinstimmenden Teile der Zeichenfolge abgerufen werdenBesser für einen zukünftigen Betreuer der JSL oder besser für den Computer oder eine andere Maßnahme? Hier sind ein paar Ideen; Ich tendiere zum ersten, auch weil ich mir vorstelle, dass Sie mit einem JSL-Ausdruck und nicht mit einer Textzeichenfolge begonnen haben.
Eine Anmerkung zu Kommentaren und zum Sehen von Bäumen bzw. zum Sehen von Wäldern: Meine Kommentare beziehen sich auf Baumebene. Sie beschreiben nicht Ihr Ziel (den Wald), sondern die Bäume. Jeder, der Ihre JSL in Zukunft verwaltet, möchte beide Arten. Ein Kommentar auf Gesamtstrukturebene sollte erklären, warum Sie über diese Werte nachdenken. Auf der Baumebene geht es darum, wie ein nicht offensichtlicher Code funktioniert.
ex = "Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
// write(ex) // Select Where( :"BWA"n == "BWA005" | :"BWA"n == "BWAZ006" )
// Regex match( ex, "[\!"](BWA|BWAZ|BWAZ_)([0-9]{1,})(.*?)[\!"]" )
// desired result: "BWA005,BWAZ006"
//
// it isn't 100% clear what the rules are. These examples make different assumptions.
// assume the text is valid JSL that can be parsed back into an expression
// below, also assumes | but not & and no nested parens
expression = Parse( ex ); // Select Where( :BWA == "BWA005" | :BWA == "BWAZ006" )
// get the argument of the select where(...)
expression = Arg( expression, 1 ); // :BWA == "BWA005" | :BWA == "BWAZ006"
// assume there are only | (or) operators, change x|y|z => {x,y,z}
Substitute Into( expression, Expr( Or() ), {} ); // {:BWA == "BWA005", :BWA == "BWAZ006"}
result = {}; // accumulate answer in a result list
// process the expression list
For Each( {op}, expression, // :BWA == "BWA005" etc.
// the Right Hand Side of :BWA == "BWA005" is "BWA005"
RHS = Arg( Name Expr( op ), 2 ); // assign(:BWA,"BWA005"), want 2nd arg
// apply the test to see if this is one to keep
If( !Is Missing( Regex( RHS, "(BWA|BWAZ|BWAZ_)([0-9]+)" ) ),
Insert Into( result, Arg( op, 2 ) ); // yes: keep it in the result list
);
);
// join the list of RHS strings, separated by commas
Show( Concat Items( result, "," ) ); // Concat Items(result, ",") = "BWA005,BWAZ006";
<BR />// alternate example<BR /><BR />
// assume the strings can't collide with column names, perhaps because no
// column name has a suffix number and all strings do have a suffix number
result = {};
Pat Match(
ex,
// this is the pattern; it repeats as long as it can
Pat Repeat(
// either match the BWA... pattern, in quotes, stashing the regex match into the result:
( "\!"" + Pat Regex( "(BWA|BWAZ|BWAZ_)([0-9]+)" ) >> result[N Items( result ) + 1] + "\!"" )
// >> is the patImmediate() operator that copies the LHS match into the RHS location
// the list is initially 0 items long, and [nitems+1] extends the list by one more item
| // OR the alternative...
Pat Len( 1 ) // advance one character. This is how most of the text is matched.
)
);
Show( Concat Items( result, "," ) ); // Concat Items(result, ",") = "BWA005,BWAZ006";
// you *could* write a pattern match that would parse the text as an expression,
// but that is what the first example did.Betreff: Regex: Es können nicht alle übereinstimmenden Teile der Zeichenfolge abgerufen werdenFür Regex Match besteht ein Wunsch
Fügen Sie Regex Match() ein Flag hinzu, um alle nicht überlappenden Vorkommen von Muster zu finden . Je nachdem, was Sie tun möchten (+ warum und wo), gibt es viele verschiedene Möglichkeiten, damit umzugehen (um nur einige zu nennen, die bereits erwähnt wurden: Schleifen und jmps eigener Mustervergleich), aber es könnte noch mehr Optionen geben, die für Ihren Anwendungsfall besser geeignet sind.
Re: Regex: can't get all parts of the string that matchWith Jmp18, it got much easier just to use Python's re.findall:
ex="Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
Python send(ex);
Python Submit ("
import re
matches = re.findall(r'(BWA|BWAZ)([0-9]+)',ex)
");
Python get (matches)