2014-02-19 4 views
0

Я хочу, чтобы регулярное выражение заменяло один символ пробелом (или удаляло их).Regex, чтобы соответствовать одному символу в String

Например, если у меня есть:

" I have played u with no i and no j o o o o x w x x s" 

Она должна возвращать:

" have played with no and" 

Я пробовал:

\s+\w{1}\s+ 

Но когда я использую его я получаю:

" have played with no and no o o x x s" 

Я что-то упустил? Я думаю, что это связано с чем-то вроде «совпадающих совпадений».

+0

Должно ли быть «сыграно без« нет »и« нет »? Является ли первое пространство преднамеренным? – elclanrs

+1

Показать код (как вы используете это регулярное выражение). –

+5

Java или JavaScript? – nhahtdh

ответ

2

Ваше регулярное выражение работает следующим образом:

найти space то один символ, а затем другой space, и удалить его. В этом случае пространство, которые окружают один символ не может быть подобрано в испытании другого персонажа, как и в случае

_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 

Чтобы решить эту проблему, просто включить в игре один или несколько пробелов (или начало строки) и один символ после этого как (^|\s+)\w.
Кроме того, чтобы убедиться, что после этого символа на листе одно место (или конец строки), но чтобы не включать это пространство в соответствие, вы можете использовать механизм look-ahead, например (?=\s+|$).

Таким образом, в случае Java попробовать

String newString = yourString.replaceAll("(^|\\s+)\\w(?=\\s+|$)",""); 

и в JavaScript

var replaced = text.replace(/(^|\s+)\w(?=\s+|$)/g,"") 

BTW \w будет соответствовать любому символу из [a-zA-Z0-9_] так что вы можете изменить его на что-то вроде [a-zA-Z], если вы хотите только буквы.

+0

Я не знал оператора Lookahead (никогда не использовался). Спасибо, это именно то, что я искал. – mfcabrera

+0

(^ | \ s ++) \ w (? = \ S ++ | $) закончил использование этой модификации. – mfcabrera

1

Я предполагаю, что язык javascript (проверьте свои теги). Проблема, которую я вижу, заключается в том, что ваше регулярное выражение включает пробелы, поэтому, если у вас есть «aa b c», то он соответствует «a», но c не имеет пробелов до или после себя.

var text=" a bb c dd e f g tt" 
var re=/\s*\b\w\b/g //If you're coding in Java, remove the g: "\\s*\\b\\w\\b" 
text.replace(re,"") //" bb dd tt" 
+0

На самом деле это просто ... Мне не хватало оператора границы слова. – mfcabrera

+1

@mfcabrera Я бы сказал, что это может быть даже слишком просто, потому что он также примет 'I' и' m' в 'I'm'. – Pshemo

+0

Я не знаю, почему кто-то проголосует за него ... это не так «прямолинейно» при этом выглядит. – mfcabrera

Смежные вопросы