\1\1\1\1\1
Die JSL REGEX-Funktion Regex hat ein Formatargument, das standardmäßig „\0“ ist. \0 ist der Rückverweis auf den gesamten übereinstimmenden Text.
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "\w{6,6}", "\0"); // look for exactly 6 word characters
„gesprungen“
Andere Rückverweise werden durch Klammern erstellt.
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "(\b\w{4,4}\b).*(\b\w{4,4}\b)",
"this part: \0\!nhas this: \1\!nand this: \2\!nfour letter words");
„Dieser Teil: über die Faulen
hat das: vorbei
und das: faul
Wörter mit vier Buchstaben“
Das erste Beispiel mit sechs Buchstaben funktionierte, weil es keine Wörter gab, die länger als sechs Buchstaben waren. Das Beispiel mit einem Wort aus vier Buchstaben ist komplizierter; Es verwendet \b, um Wortgrenzen abzugleichen. Ohne den Grenztest, schnell scheint ein aus vier Buchstaben bestehendes Wort zu sein. Das Formatargument erzeugte alle vier Textzeilen unter Verwendung der Rückverweise \0, \1 und \2. \1 ist die erste Klammergruppe und \2 die zweite. \0 ist immer noch der gesamte Text, der übereinstimmt. ( \!n ist ein Zeilenumbruchzeichen. Es läuft alles zusammen, da alle Leerzeichen Teil der Ausgabe werden. )
Bei Regex wird standardmäßig die Groß-/Kleinschreibung beachtet. In diesem Beispiel findet keine Übereinstimmung statt und es wird ein fehlender Wert zurückgegeben
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "DOG");
.
Dafür gibt es eine Option.
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "DOG", "\0", IGNORECASE);
"Hund"
Und es gibt Spezifikationen zum Ändern der Groß-/Kleinschreibung in der Formatzeichenfolge.
sentence = "tHe QUick BROWN fox jUMPED over the lAZy DoG";
regex( sentence, "\b(\w)(\w*)\b", "\U\1\E\L\2\E", IGNORECASE, GLOBALREPLACE);
„Der schnelle Braunfuchs sprang über den faulen Hund“
Der reguläre Ausdruck hat die Groß-/Kleinschreibung in Anfangsbuchstaben eingegeben. Die Formatzeichenfolge enthält \U, um mit der Großschreibung zu beginnen, \L, um mit der Kleinschreibung zu beginnen, und \E, um die Groß-/Kleinschreibung zu beenden.
Grammatik für Regex-Ersatzzeichenfolgen (ähnlich wie Perl)
- \L – Beginnen Sie mit der Kleinschreibung der Ausgabe bis \E
- \U – Beginnen Sie mit der Großschreibung der Ausgabe bis \E
- \E – Ende der Schreib- und Anführungszeichenänderungen
- \l – (Kleinbuchstabe L) – Kleinschreibung des nächsten Zeichens
- \u – Großbuchstabe des nächsten Zeichens
- \0 ... \999 – ersetzt einen der übereinstimmenden Ausdrücke aus dem Muster
- \e – Ende einer Zahl, wenn weitere Ziffern folgen: \7\e123 bedeutet Ausdruck 7 gefolgt von 123 (JMP-Erweiterung)
- \\ – ein einzelner Backslash
Es wurde ein Fehler gefunden: Dies funktioniert derzeit nicht, wird aber in der 12.2-Wartung funktionieren (Schleifen aufgrund einer fehlerhaften Interaktion mit IGNORECASE und GLOBALREPLACE und der Übereinstimmung mit der Länge Null am Ende der Zeichenfolge).
sentence = "tHe QUick BROWN fox jUMPED over the lAZy DoG";
regex( sentence, "\b(\w*)\b", "\L\u\1", IGNORECASE, GLOBALREPLACE);
Da die Suchzeichenfolge keine fallspezifischen Zeichen enthält, funktioniert Folgendes:
sentence = "tHe QUick BROWN fox jUMPED over the lAZy DoG";
regex( sentence, "\b(\w*)\b", "\L\u\1", GLOBALREPLACE);
„Der schnelle Braunfuchs sprang über den faulen Hund“
Durch die Verwendung von \w+ anstelle von \w* wird das Problem ebenfalls vermieden, da darauf bestanden wird, dass Wörter mindestens ein Zeichen haben.
Der Tennessee Waltz steht auf der Vorderseite.
Update 4. Februar 2017: Formatierung (und Bild) für neue Community korrigiert.
Vielen Dank für die Hilfe,
Ich denke nur, dass das Skript funktioniert, wenn ich im FOR-Cicle „Colnames“ anstelle von „ColsList“ verwende
Globale löschen ();
Protokoll löschen ();
dt = Aktuelle Datentabelle ();
ColNames = dt << Spaltennamen abrufen ( „Zeichenfolge“ );
Für ( ich = 1 , ich <= N Artikel ( ColNames ), i++,
Wenn ( ! Wird vermisst ( Regex ( Verkohlen ( ColNames[i] ), „^[0-9]“ ) ),
Spalte = Spalte ( dt, i ); // wobei dt Ihre Datentabelle ist
ColName = Col << Holen Sie sich den Namen ;
NeuerName = Konkat ( „*“ , Spaltenname );
Col << Name einsetzen ( Neuer Name );
)
);
Ich bin ein Anfänger in der JMP-Skripterstellung. Verzeihen Sie mir, wenn ich falsch liege
Möglicherweise müssen Sie den regulären Ausdruck in ändern
<SPAN class="token string">"^[0-9]"</SPAN>
um es zu zwingen, das Zeichen am Anfang der Zeichenfolge zu finden. Andernfalls würde ein Name wie Column7 übereinstimmen.
@gianpaolo ,
Hier ist eine Möglichkeit, darauf einzugehen. Mein Vorschlag ist, solche Fragen unter „Diskussionen“ zu posten – und einen Link zum Blog bereitzustellen. Die Community kann Ihre Frage schneller beantworten:
Clear Globals(); Clear Log();
dt = Current Data Table();
ColNames = dt << Get Column Names("String");
for( i = 1 , i <= N Items(ColsList) , i++,
If(!IsMissing(Regex(Char(ColsList[i]),"[0-9]")),
Col = Column(dt,i); // where dt is your data table
ColName = Col << Get Name;
NewName = Concat("*",ColName);
Col << Set Name(NewName);
);
);
Es wird ein Screenshot der Datentabelle (dt) bereitgestellt, die ich zum Ausführen des Beispiels erstellt habe
Hallo Craige_Hales,
Ich fand die Funktion „regex“ für die Anwendung meiner Arbeiten sehr interessant.
Ich muss meinen Comuns-Namen für mein Skript im Detail ändern. Ich möchte ein Zeichen einfügen, wenn mein Spaltenname mit einer Zahl beginnt.
z. B. wenn: „00001 DATEN Nr. 1“
dann wird es sein: „*00001 DATA no 1“ (in diesem Fall habe ich „*“ hinzugefügt)
wenn: „DATEN Nr. 1“
dann lautet: „DATEN Nr. 1“ (in diesem Fall keine Änderungen)
Ist es möglich, Regex zu verwenden? kannst du mir helfen?
vielen Dank
Ciao Gianpaolo