如何使用正则表达式仅在单词之间而不是数字或特殊字符之间删除 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).
中
详情
(?<=\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();
我有这样一个字符串;
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).
详情
(?<=\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();