2014-12-24 3 views
1

я получил предложение так:Сожмите слова сломанных пробелов, не затрагивая другие слова в предложении

The fox j u m p e d over the big b r o w n boar ! 

Я хочу изменить это в:

The fox jumped over the big brown boar ! 

(Примечание - пространства раздавленных когда в середине, но оставлено между полными словами и восклицательным знаком)

Я написал этот код для этого:

str = 'The fox j u m p e d over the big b r o w n boar !' 
prev_char = '0' 
prev_prev_char = '0' 
next_next_char = '0' 
new_str = '' 
(0..(str.length)).each do |index| 
    t_char = str[index] 
    prev_char = index > 0 ? str[index-1] : '0' 
    prev_prev_char = index > 1 ? str[index-2] : '0' 
    next_next_char = index-1 < str.length ? str[index+2] : '0' 
    new_str = "#{new_str}#{t_char}" unless t_char == ' ' && prev_char != ' ' && prev_prev_char == ' ' && next_next_char == ' ' 
end 
results = new_str.split(' ').join(' ') 
p (results == 'The fox jumped over the big brown boar !') 

Но я уверен, что есть лучший или более умный подход. Какие-либо предложения?

+0

Что ожидается от 'A fox j u m p e d ...'? – Toto

+0

@ M42 Я ожидаю, что это будет «Лисица прыгнула ...» –

+0

Тогда каково правило для объединения букв? Почему «f o x» становится «лисой», а не «afox»? – Toto

ответ

2

Вот короткий:

(?:(?<=\s\w)|(?<=^\w))\s(?=\w\W) 

Заменить матчи с пустой строкой.

Demo.

Это основано на предположении, что рядом друг с другом не будет двух односимвольных слов. Если он найдет такую ​​вещь, он удалит пространство между ними.

Если вы хотите получить фантазии, вы можете предотвратить его собирание I a, как в Am I a good programmer? и конкатенации нижне- и символы верхнего регистра:

(?:(?<=\s\w)|(?<=^\w))\s+(?=[a-z]\W)(?!(?<=I\s)a) 

Demo.

+1

Точно ... :-) https://regex101.com/r/cB2uL9/4 –

+1

@EddieB: Спасибо, ответьте обновлен. –

2
(?<=\s[a-zA-Z])\s(?=[a-zA-Z]\s[a-zA-Z]|[a-zA-Z](?:$|\.)) 

Try this.Replace по empty string .Увидь демо.

https://regex101.com/r/gQ3kS4/15

+0

Извините за то, что вы всегда придирчивы, но это не работает, если второй символ - это пробел, например. 'T h e' ->' T he'. –

+0

@Rawing right !!!!! : P – vks

+0

@vks Вы определенно преуспеваете ... Но вам нужно исключение для «I и A» ... единственных однобуквенных слов на английском языке. (?! [ia]) –

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