2017-06-24 8 views
2

Ich versuche, eine Regex zu machen, die in einer Ausnahme verwendet wird.RegEx-Ausdruck zur Behandlung mehrerer Bedingungen zum Brechen von Sätzen

Daher muss es für diese Sätze false zurück (die führenden Ziffern sind in den Strings enthalten):

3.{17} this is italics and should break.{18} 

4. this is another sentence and should break. 

5. This is another sentence and should break. 

Und es muss zurückkehren Wahr für diese:

There are 2 reasons for this 1. you are here and 2. you are communicating. 

Is it 2? they wanted to know. 

1 digit at the beginning but with 1. with a period should return true.

Mit anderen Worten, wenn der Anfang der Zeichenfolge eine Zahl gefolgt von einem Punkt ist, sollte es false zurück (auch wenn "\{\d+\}" folgt optional) und das Zeichen, das dem Leerzeichen folgt, spielt keine Rolle. Und es muss true zurückgeben, wenn die Zahl und der Punkt (oder ! oder ?) in den Satz eingebettet ist, gefolgt von einem Kleinbuchstaben, in anderen Fällen muss es falsch sein.

Als weitere Anmerkung: Dies geht in eine Java-Eigenschaftendatei, und der Wert wird dann an eine perl5 Regex-Engine übergeben, um den fehlerhaften Text zurückzugeben.

Ich versuche, es in einem Ausdruck auszudrücken, aber irgendwie kann ich es nicht richtig machen. Dies ist es, was mit bisher kommen:

^([^0-9\.]+[\.]| 
[^\.!\?]*[\?!]+[\?!\.]+| 
[0-9]+[^\?!\.]+[\?!\.]+| 
[^0-9]*[0-9]+[^\?!\.]+[\?!\.]+) 
(\{\d+\}[\u0020\u00A0]| 
[\u0020\u00A0]*)[a-z] 

ich in einer Sackgasse zu angekommen scheinen und sehen nicht, was ich falsch haben.

Danke für jeden Hinweis.

Update: Ein einfacheres Format mit Vorgriff: ^(?!\d+\.)[^.!?]*[.!?]+(\{\d+\}\s|\s*)\p{Ll} basierend auf den Kommentaren.

+0

Haben die Sätze auch Anführungszeichen um sie herum und haben immer ein Leerzeichen nach '.'? –

+0

@ l'L'l - keine Anführungszeichen, und Leerzeichen ja nach dem '.' oder'! 'Oder'? 'Ich habe die Beispiele – ib11

+0

Ich verstehe die Frage nicht. Die Beispielzeichenfolgen können mit "^ \ D" verglichen werden. – melpomene

Antwort

1

können Sie verwenden

^(?!\d+\.)[^.!?]*[.!?]+(\{\d+\}\s|\s*)\p{Ll} 

die regex demo See.

Das Muster passt:

  • ^ - Beginn der Saitenanker
  • (?!\d+\.) - ein negative lookahead, die das Spiel wird scheitern, wenn das Muster am Anfang der Zeichenfolge abgestimmt ist: 1+ Ziffern mit einem gefolgt
  • dot
  • [^.!?]* - 0+ Zeichen anders als ., ! und ?
  • [.!?]+-1 oder mehr ., ! oder ? Symbole
  • (\{\d+\}\s|\s*) - entweder eine { + 1 oder mehr Ziffern + } oder 0+ Leerzeichen (wenn Sie mit diesem Erfassung Gruppe nicht interessiert im Wert erfaßt sind, können Sie ihn in eine nicht drehen -capturing eins durch Hinzufügen ?: nach dem ersten ().
  • \p{Ll} - ein Kleinbuchstabe (wenn ein u Modifikator verwendet wird, wird es auch alle Unicode-Kleinbuchstaben entsprechen).
Verwandte Themen