2017-12-15 2 views
0

Diese regex Frage ist eine Art Verlängerung des this questionJava regex - Quantifizierer in negativer Lookbehind

Eingangs

String input="first number <start number>123.45<end number> 
       and second number 678.90." 

gewünschte Ausgangs

String output="first number <start number>123.45<end number> 
       and second number <start number>678.90<end number>." 

Was habe ich versucht,

Ich habe einen negativen Lookback für <number start> und einen negativen Look-Ahead für <number end>:

String regex="(?<!(<number start>))\\d+(\\.\\d+)?(?!(<number end>)) 
//    ^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^ 
//   negative lookback     negative lookahead 
//         ^^^^^^^^^^^^^ 
//         float match 

Aber das Problem ist, dass <number start>12.34<number end> für einen String auf 2.3 Übereinstimmen.

Als ich quantifiers im Lookback enthalten bekomme ich einen Fehler

String regex="(?<!(<number start>\\d+))\\d+(\\.\\d+)?(?!(\\d+<number end>)) 
//    ^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^ 
//   negative lookback      negative lookahead 
//          ^^^^^^^^^^^^^ 
//          float match 

Danke für die Hilfe!

+1

Nur ['" (? ) \\ b \\ d + (?: \\. \\ d +)? \\ b (?! ) "'] (https: // regex101 .com/r/6xTKBh/1) wird funktionieren. –

+1

Erstens ist dies keine doppelte Frage. Zweitens hilft der vorgeschlagene Regex nicht. – l33t

+0

@ l33t Erkläre, warum mein Vorschlag nicht hilft. Ich habe eine Regex-Demo zur Verfügung gestellt, die korrekt funktioniert: Die Regex stimmt nicht mit einer Zahl innerhalb von '' -Tags überein. –

Antwort

0

Es ist eine Begrenzung der unglaublich langsame lookbehind Funktion. Für Lookbehind können Sie keinen Ausdruck haben, der zu Text beliebiger Länge passt. Was sagt uns die Fehlermeldung?

Man könnte so etwas wie dies versuchen:

(<start number>[-+]?\d*\.?\d+<end number>)|([-+]?\d*\.?\d+) 
  • $ 1: Die Tags Spiele einschließlich.
  • $ 2: Treffer ohne die Tags.

Dann ersetzen Sie den Text entsprechend.