2015-02-25 2 views
-3

оригинал: «У меня есть M5 2 0 0 и мне это нравится»
предназначен: «У меня есть M5200 и мне это нравится»Удаление пробелов между цифрами в строке

Как бы вы достичь этого как algoritm или дать пример кода? Я считаю, что этот вопрос действительно во многих языках программирования, поэтому я не буду спрашивать его об этом.

+0

Eh, * регулярное выражение *? –

+0

Кевин прав. Пожалуйста, укажите в качестве комментария, если нужно заменить несколько пробелов или вкладок. – profimedica

+0

Вы правы, это неожиданно, я намеревался пробелы, но ответ Кевина также дает решение для вкладок. Спасибо, Кевин! –

ответ

3

C# пример (заменяя регулярным выражением):

String original = "I have the M5 2 0 0 and I like it"; 

String result = Regex.Replace(original, @"\d(*\d*)*\d", 
    (MatchEvaluator) (match => { 
    return match.Value.Replace(" ", ""); 
})); 
2

Для языков, которые не имеют регулярных выражений: итерацию по тексту. Если текущая буква - это пробел, а буквы, окружающие ее, являются цифрами, то не добавляйте ее к результату.

реализация Python

Пример:

text = "I have the M5 2 0 0 and I like it" 
result = [] 
for i in range(len(text)): 
    if i > 0 and i < len(text)-1: 
     prev = text[i-1] 
     next = text[i+1] 
     if text[i] == ' ' and prev.isdigit() and next.isdigit(): 
      continue 
    result.append(text[i]) 
print "".join(result) 

Результат:

I have the M5200 and I like it 
+1

текст [i] == '' не будет рассматривать области табуляции – profimedica

+2

Я не знал, означал ли OP «буквальный пробел» или «любые пробелы», когда он сказал пробел. Нет проблем, однако - просто замените 'text [i] == ''' на 'text [i] .isspace()', если вы хотите также обнаружить вкладки. – Kevin

+0

Я думаю, я должен также указать, что это не удалит _multiple_ пробелы между цифрами. ех. вывод для 'a 1 (пробел) (пробел) (пробел) 2 b 'будет таким же, как и его вход. Мне не совсем понятно, какое поведение ФП хотел бы в этом случае. – Kevin

2

Для питона вы можете использовать:

import re 
line = 'I have the M5 2 0 0 and I like it' 
line = re.sub(r'(\d+)\s+(?=\d)',r'\1', line) 
print(line) 

где \ 1 обозначает первую группу \ d + и второй группа не будет заменена? = \ d, потому что она используется только для сопоставления.

Результат: У меня есть M5200, и мне нравится это

1

Java, решение:

public static void main(String[] args) { 
    String input = "I have the M5 231 0 0 and I like it"; 
    String output = ""; 
    if (input.length() > 0) { 
     output += input.charAt(0); 
    } 
    for (int i = 1 ; i < input.length()-1 ; i++) { 
     if (Character.isDigit(input.charAt(i-1)) && 
      Character.isDigit(input.charAt(i+1)) && 
      Character.isSpaceChar(input.charAt(i))) { 
      continue; 
     } else { 
      output += input.charAt(i); 
     } 
    } 
    if (input.length() > 1) { 
     output += input.charAt(input.length() - 1); 
    } 
    System.out.println(output); 
} 
Смежные вопросы