Chcę, aby wyrażenie regularne zastąpiło pojedynczy znak spacją (lub je usunęło).
Na przykład, jeśli mam:
" I have played u with no i and no j o o o o x w x x s"
Powinien zwrócić:
" have played with no and"
Próbowałem:
s+w{1}s+
Ale kiedy go używam, otrzymuję:
" have played with no and no o o x x s"
Czegoś mi brakuje? Myślę, że jest to związane z pewnego rodzaju „nakładającymi się dopasowaniami”.
Odpowiedzi:
2 dla odpowiedzi № 1Twoje wyrażenie regularne działa w ten sposób:
odnaleźć space
potem jedna postać, a potem druga space
i usuń go. W tym przypadku spacje otaczające jedną postać nie mogą być dopasowane w teście innej postaci, jak w przypadku
_a_b_c
^^^ -this part matches our pattern so it will be removed leaving
b_c and now neither `b` or `c` is surrounded with spaces so they will not
be removed
Aby rozwiązać ten problem, po prostu dołącz w dopasowaniu jedną lub więcej spacji (lub początek łańcucha) i jeden znak po nim (^|s+)w
.
Również, aby upewnić się, że po tym znaku jest przynajmniej jedna spacja (lub koniec łańcucha), ale aby nie uwzględniać tych spacji w dopasowaniu, możesz użyć patrz przed siebie mechanizm podobny (?=s+|$)
.
Więc w przypadku Javy spróbuj
String newString = yourString.replaceAll("(^|\s+)\w(?=\s+|$)","");
i w JavaScript
var replaced = text.replace(/(^|s+)w(?=s+|$)/g,"")
BTW w
będzie pasować do dowolnej postaci z [a-zA-Z0-9_]
więc możesz zmienić to na coś takiego [a-zA-Z]
jeśli chcesz tylko litery.
1 dla odpowiedzi nr 2
Zakładam, że językiem jest javascript (proszęsprawdź swoje tagi). Problem, który widzę, polega na tym, że wyrażenie regularne obejmuje spacje, więc jeśli masz „aa b c”, to pasuje do „a”, ale wtedy c nie ma spacji przed sobą ani po nim.
var text=" a bb c dd e f g tt"
var re=/s*bwb/g //If you"re coding in Java, remove the g: "\s*\b\w\b"
text.replace(re,"") //" bb dd tt"