2017-10-23 1 views
2

Ich möchte eine Gruppe mit einer festen Länge aus einer Zeichenfolge extrahieren, aber führende Nullen ignorieren.Führende Zeichen in Regex-Gruppe ausschließen

Beispiel:

String: 1a2300245filler060403105543a 
      ^^^^^  ^^^^^^ 

Aktuelle regex:

part_x = 00245 

part_y = 060403 

Is there some way to remove the leading zeroes from the grouping to get this? 

part_x = 245 

part_y = 60403 

Beachten Sie, dass die anfängliche Länge von part_x und part_y befestigt ist (5 bzw. 6): .{4}(?<part_x>[\d]{5})filler(?<part_y>[\d]{6})

Das gibt mir. Ich möchte nur die führenden Nullen irgendwie in der Regex trimmen.

+0

scheint es schwierig, dies in der regex auszuführen .. Sie können dies später tun. –

Antwort

2

Es ist ein wenig umständlich selektiv anzupassen und überlappende Teilausdrücke wie diese zu erfassen, aber hier ist ein Trick, den Sie in diesem speziellen Fall und Fälle wie es verwenden können:

.{4}(?=\d{5}(.++))0{0,4}(?<part_x>\d+(?=\1))filler(?=\d{6}(.*+))0{0,5}(?<part_y>\d+(?=\3)) 

Der Trick hier ist (?=\d{5}(.++)) peeks vor der aktueller Übereinstimmungspunkt, um sicherzustellen, dass 5 Ziffern vorhanden sind (wie von Ihnen vorgeschrieben), aber dann geht (.++) weiter und erfasst den Rest der Betreff-Zeichenfolge für spätere Tests. Dann werden mögliche führende Nullen außerhalb des Captures konsumiert, wobei (?<part_x>\d+(?=\1)) übrigbleibt, um den Rest der Ziffern wiederzupassen, um noch einmal nach vorne zu schauen, um zu verifizieren, dass es an der Position, an der \1, zuvor erfasst, folgt.

part_x und part_y sollten dann wie erforderlich ausgefüllt werden.

Wenn Sie wollen etwas, das vom Konzept her einfacher zu verstehen ist, können Sie die folgenden Funktionen entsprechen, beispielsweise 5 Ziffern und Erfassung ohne führende Nullen verwenden:

(?|0([1-9]\d{3})|00([1-9]\d\d)|000([1-9]\d)|0000(\d)) 
Verwandte Themen