2016-08-17 5 views
1

Ziel ist es, Text zwischen Ganzzahlen und Einheitennamen in Sublime Text 3 mit Regex auszuwählen. Ich dachte, auf diese Weise: erste Zahlen und Einheitennamen wählen, dann wählen Sie einfach alles zwischen ihnen:Wie wähle ich Text zwischen Ganzzahlen und Einheitennamen in Sublime Text 3 mit Regex?

(?<=(1))(2)(?=(3)) 

Regexp # 1 sollte ganze Zahlen erfassen, regexp # 3 sollten benötigte Einheitennamen erfassen, 2 regexp # fängt gerade alle zwischen diesen zwei Gruppen.

Hier sind die Ausdrücke i schrieb:

  1. (((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+
  2. (.{1,10}?)
  3. ((?<=\d)|(?<=\b))(моль|мкм|мф|нм|лм|кг|кд|Гц|Кл|К|Дж|Вт|м|с|ф|А)(?=\b)

# 1 und # 3 Werke ok, eine Kombination von # 2 und # 3 Werke zu , aber # 1 + # 2 und # 1 + # 2 + # 3 funktioniert nicht und der Grund ist der Fehler "Ungültige Lookbehind-Assertion im regulären Ausdruck gefunden". Also ich denke, der Fehler ist in der ersten Gruppe: (?<=(1)). Wenn Sie meine # 1 in sie einfügen, wird der ganze Ausdruck wie folgt aussehen:

(?<=((((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+)) 

Dieser Ausdruck gibt mir die Fehlermeldung „Ungültige Lookbehind Behauptung in regulären Ausdruck angetroffen“.

Was stimmt nicht mit dem Ausdruck? Es sollte mit dem genauen Erfassung Ausdruck kombiniert werden, so dass es zu testen ich diesen Ausdruck (# 1 + # 2):

(?<=((((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+))(.*+) 

Ich habe versucht, Elemente aus dem Lookbehind zu entfernen, bis sie sich an der Arbeit, und es funktioniert nur, wenn es nur ein Element hat:

(?<=(\d))(.*+) 

es gibt einen Fehler, auch wenn ein quantifier zum \d hinzugefügt wird. Das funktioniert nicht:

(?<=(\d+))(.*+) 

Wie kann ich meine Regexp # 1 in einem Lookbehind einfügen? Ich habe keine Ahnung, warum es nicht funktioniert.

Vielen Dank im Voraus!

PS: die Einheiten in Russisch ist, also hier der Text verwende ich regexps zu testen:

9 192 631 770 Гц[15]; 
299 792 458 м/с[15]; 
6,022 14X·1023 моль−1; 
540·1012 Гц 
1 мкм- 
1 мкм 
1мкм 
1&#160;мкм 
12 мкм 
12мкм 
12&#160;мкм 
500 647 м 
500 647м 
12 нм 
12нм 
12&#160;нм 
12 сс 

Update: die letzte und funktionierende Version von regex:

((((?<=\d)([-−,*·\s]|(X·))(?=\d))|(\d))+)\K(.{0,10}?)(?=(((?<=\d)|(?<=\b))(моль|мкм|мф|нм|лм|кг|кд|Гц|Кл|К|Дж|Вт|м|с|ф|А)(?=\b))) 

Alle Änderungen war besteht, dass ich die Struktur des Ausdrucks von diesem geändert:

(?<=(1))(2)(?=(3)) 

Um dies zu:

+0

http://stackoverflow.com/documentation/regex/639/lookahead-and-lookbehind/2462/simulating-variable-length-lookbehind-with-k#t=201608171026507447766 könnte Ihnen helfen :) –

+0

Boost Regex nicht unterstützt unendliche Breite Lookbehind, und Sie brauchen es wirklich nicht, wie Sie einfach Ihr Muster setzen und dann '\ K' direkt danach verwenden können. –

+0

Probieren Sie '\ d + (?: (?: [-, * \ s] | X ·) \ d +) * \ K. {1,10}? (Моль | мкм | мф | нм | лм | кг | кд | Ö | | | | | | | | | | | | | | | | | | | | | |) und durch '$ 1 'ersetzen ([demo] (https://regex101.com/r/eB2oI1/1)). –

Antwort

1

Der Punkt ist, dass Sublime Text Regex mit Boost Regex-Bibliothek, die keine unendliche Breite Lookbehind unterstützt.

Um das zu mildern, unterstützt Boost den Operator \K, der wie ein positiver Lookbehind funktioniert. Sobald das Muster auf der linken Seite von \K übereinstimmt, verwirft die \K es, beginnend mit dem Schreiben neu übereinstimmenden Text in einen freien Puffer.

Verwenden Sie das Schema PATTERN_1\KPATTERN_2(?=PATTERN_3), um durch eine leere Zeichenfolge zu ersetzen.

Verwandte Themen