/ / Regex, aby dopasować pojedynczy znak w łańcuchu - java, javascript, regex

Regex, aby dopasować pojedynczy znak w łańcuchu - java, javascript, regex

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 № 1

Twoje wyrażenie regularne działa w ten sposób:

odnaleźć space potem jedna postać, a potem druga spacei 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"