2017-06-28 4 views
2

Ich möchte alle Hashtags in einer Zeichenfolge mit ihrem entsprechenden Tag in Java ersetzen. Beispiele:Ersetze Hashtags in einem einzigen Durchlauf mit Regex

This is a #foo_bar #document about #nothing_but_tags! 

bewirkt:

This is a foo bar document about nothing but tags! 

Ist das möglich in einem einen Pass regex ersetzen? Ein Hashtag kann viele Wörter enthalten.

+0

Was sind die Regeln? Hash entfernen und Unterstrich durch Leerzeichen ersetzen? Noch etwas? – bradimus

+0

Ja, keine Regel mehr! – Mohsen

+0

Was ist das "äquivalente Tag"? – shmosel

Antwort

3

Hier ist ein Weg, um es mit einem kleinen Hack zu tun:

String str = "#This is a #foo_bar #document about #nothing_but_tags!"; 
String res = str.replaceAll(" ?#|(?<=#\\w{0,100})_", " ").trim(); 

Es mit Hashtags länger als 100 Zeichen brechen würde, und es würde einen Raum anstelle von Hash in dem Tag legen, wenn es passiert, Sei der Erste in einer Zeichenkette (daher ein Aufruf an trim()).

Demo.

Die Zeichenbegrenzung 100 kommt von {0,100} Teil Lookbehind. Dies ist eine Einschränkung der Java-Regex-Engine: Im Gegensatz zu einigen anderen Regex-Engines erfordert die Länge von Look-Aneads und Look-Behinds eine explizite Obergrenze.

+0

Danke für die Antwort. Kannst du etwas darüber erklären, wie Lookahead funktioniert? – Mohsen

+1

@Mohsen Dieses Konstrukt '(? <= # \\ w {0,100}) _' bedeutet "Unterstrich" (am Ende) vor dem, was in Klammern nach '=' steht, dh '# \\ w {0,100}', was "ein Hashtag und bis zu 100 Wortzeichen" bedeutet. Nichts davon wird jedoch erfasst: Die Regex-Engine überprüft sie als Voraussetzung für die Übereinstimmung, aber nur der Unterstrich wird wirklich abgeglichen. Hier ist [ein Link zu meinem Lieblings-Tutorial über Lookaheads und Lookbehinds] (http://www.regular-expressions.info/lookaround.html). – dasblinkenlight

Verwandte Themen