如何使用正则表达式仅在单词之间而不是数字或特殊字符之间删除 space?

How to remove space only between words and not digits or special characters using Regex?

我有这样一个字符串;

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

我希望输出看起来像这样;

abcd 1234567 1234567 efgh 1234567 1234567 ijkl - - - -

如何实现?目前我正在使用以下内容,但它不起作用。

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

谢谢。

我认为这种模式适合你。 /(?<=[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);

要删除 ASCII 字母之间的所有空格,您可以使用

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

或者,要匹配任何 Unicode 字母之间的任何 Unicode 空格,您可以使用

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

请注意,在 Java 中,如果您希望 \s 匹配任何 Unicode 空格(shorthand 字符 类 在 Java 中默认不识别 Unicode,它们在 Android).

regex demo

详情

  • (?<=\p{L}) - 正后视匹配字符串中紧接任何 Unicode 字母
  • 的位置
  • \s+ - 1+ 个空格
  • (?=\p{L}) - 匹配字符串中紧跟任何 Unicode 字母的位置的正向先行。

可能有一个很好的 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();