Как убрать пробел только между словами, а не цифрами или специальными символами с помощью Regex? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть такая строка:

ab cd 1234567 1234567 ef gh 1234567 1234567 ij kl - - - -

Я хочу, чтобы вывод выглядел следующим образом;

abcd 1234567 1234567 efgh 1234567 1234567 ijkl - - - -

Как этого добиться?В настоящее время я использую следующее, и оно не работает.

result = result.trim().replaceAll("(\\w)(\\s+)([\\.,])", "");

Спасибо.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Чтобы удалить все пробелы между буквами ASCII, вы можете использовать

result = result.trim().replaceAll("(?<=[A-Za-z])\\s+(?=[A-Za-z])", "");

Или, чтобы сопоставить любые пробелы Юникода между любыми буквами Юникода, вы можете использовать

result = result.trim().replaceAll("(?<=\\p{L})\\s+(?=\\p{L})", "");

Обратите внимание, что в Javaнеобходимо добавить к шаблону (?U), если вы хотите, чтобы \s соответствовал любым пробелам Unicode (сокращенные классы символов по умолчанию не поддерживают Unicode в Java, они в Android).

См. regex demo

Подробности

  • (?<=\\p{L}) - положительный взгляд сзади, который соответствует местоположению внутри строки, которому непосредственно предшествует любойБуква Unicode
  • \\s+ - 1+ пробелов
  • (?=\\p{L}) - положительный прогноз, который соответствует расположению внутри строки, за которым сразу следует любая буква Unicode.
0 голосов
/ 23 октября 2018

Вероятно, есть хороший RegEx для этого, но если вы хотите, чтобы код делал это, я могу дать вам умный способ сделать это.

Это не проверено и закодировано в тексте здесь,так что вам, возможно, придется настроить его, но вы получите картину.

String myString = 'ab cd 1234567 1234567 ef gh 1234567 1234567 ij kl - - - -'
//break it up into array split by space
String[] chunks = myString.split(" ")
StringBuilder sb = new StringBuilder();
Int x = 0
while (x < chunks.length) 
{ 
    if(isNumeric(chunks[x])){
        //if num add space back
        sb.append(chunk[x]).append(" ")
    }else if(x < chunks.length - 1 && !isNumeric(chunks[x + 1])){
        //if it's string & next value is also a string
        sb.append(chunk[x])
    }else{
        //if it's a string, but next is numeric, we need space
        sb.append(chunk[x]).append(" ")
    }
    x++;
} 

//convert back to string with space between letters removed
String correctedString = builder.toString().trim();
0 голосов
/ 23 октября 2018

Я думаю, что этот шаблон работает для вас./(?<=[a-zA-Z])\s(?=[a-zA-Z])/m

Вот пример кода.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(?<=[a-zA-Z])\\s(?=[a-zA-Z])";
final String string = "ab cd 1234567 1234567 ef gh 1234567 1234567 ij kl - - - -";
final String subst = "";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);
...