用一个正则替换整个字符串比较困难。 其实只要替换用"'"分割后的首尾两个字符串就可以了 public class Test7 { public static void main(String[] args) { String str1 = "a b c' d ef' g"; String str2 = "a b c' ' d ef' g"; String str3 = "a a s '2''3 '''' ' g'' sssd'''"; System.out.println(formatStr(str1)); System.out.println(formatStr(str2)); System.out.println(formatStr(str3)); } static String formatStr(String src) { final String flag = "'"; boolean isLastFlag = false; // 不包含flag直接替换 if (!src.contains(flag)) { return src.replaceAll("\\s{2,}", " "); } // 以flag分割数组,只有第一个和最后一个元素需要替换 // 考虑字符串最后一个字符恰好是flag的情况 if (src.endsWith(flag)) { src += " "; isLastFlag = true; } final String[] arr = src.split(flag); StringBuffer sb = new StringBuffer(); for (int i = 0; i < arr.length; ++i) { if (i == 0) { sb.append(arr[i].replaceAll("\\s{2,}", " ")); } else if (i == arr.length - 1) { if (!isLastFlag) { sb.append(flag + arr[i].replaceAll("\\s{2,}", " ")); } else { sb.append(flag); } } else { sb.append(flag + arr[i]); } } return sb.toString(); } }
String s = "a ' b' ' c '"; Pattern p = Pattern.compile("\\'(\\s{2,})"); Matcher m = p.matcher(s); while(m.find()) { s=s.replace(m.group(1), " "); p = Pattern.compile("\\'(\\s{2,})"); m = p.matcher(s);
} p = Pattern.compile("(\\s{2,})\\'"); m = p.matcher(s); while(m.find()) { s=s.replace(m.group(1), " "); p = Pattern.compile("(\\s{2,})\\'"); m = p.matcher(s); } System.out.println(s);这几行代码貌似可以满足你的需求,你看看吧!如果有不足之处,望斧正。
String str = " s s s";
System.out.println(str.replaceAll("\\s{2,}", " "));
直接弄一个正则比较麻烦。
Map<String, String> map = new HashMap<String, String>();
Pattern quotRegex = Pattern.compile("'.*?'");
Matcher matcher = quotRegex.matcher(str);
StringBuffer buff = new StringBuffer();
while (matcher.find()) {
String key = "__PLACEHOLDER__" + map.size();
String value = matcher.group();
map.put(key, value);
matcher.appendReplacement(buff, key);
}
matcher.appendTail(buff);// 以上内容将配对的引号内的东西,存为一个不太容易出现的占位符
// 以下将连续的空白符号替换掉,此时,已经不会有引号内的连续空白干扰正则StringBuffer buff2 = new StringBuffer();
String str2 = buff.toString().replaceAll("\\s{2,}", " ");
Pattern placeholderRegex = Pattern.compile("__PLACEHOLDER__\\d+");
Matcher placeholderMatcher = placeholderRegex.matcher(str2);
while (placeholderMatcher.find()) {
String key = placeholderMatcher.group();
String value = map.get(key);
placeholderMatcher.appendReplacement(buff2, value);
}
placeholderMatcher.appendTail(buff2);return buff2.toString();
下面代码是概念性的,直接手写,没经过编译,更没有测试过
其实只要替换用"'"分割后的首尾两个字符串就可以了
public class Test7 {
public static void main(String[] args) {
String str1 = "a b c' d ef' g";
String str2 = "a b c' ' d ef' g";
String str3 = "a a s '2''3 '''' ' g'' sssd'''";
System.out.println(formatStr(str1));
System.out.println(formatStr(str2));
System.out.println(formatStr(str3));
} static String formatStr(String src) {
final String flag = "'";
boolean isLastFlag = false;
// 不包含flag直接替换
if (!src.contains(flag)) {
return src.replaceAll("\\s{2,}", " ");
}
// 以flag分割数组,只有第一个和最后一个元素需要替换
// 考虑字符串最后一个字符恰好是flag的情况
if (src.endsWith(flag)) {
src += " ";
isLastFlag = true;
}
final String[] arr = src.split(flag);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; ++i) {
if (i == 0) {
sb.append(arr[i].replaceAll("\\s{2,}", " "));
} else if (i == arr.length - 1) {
if (!isLastFlag) {
sb.append(flag + arr[i].replaceAll("\\s{2,}", " "));
} else {
sb.append(flag);
}
} else {
sb.append(flag + arr[i]);
}
}
return sb.toString();
}
}
Pattern p = Pattern.compile("\\'(\\s{2,})");
Matcher m = p.matcher(s);
while(m.find())
{
s=s.replace(m.group(1), " ");
p = Pattern.compile("\\'(\\s{2,})");
m = p.matcher(s);
}
p = Pattern.compile("(\\s{2,})\\'");
m = p.matcher(s);
while(m.find())
{
s=s.replace(m.group(1), " ");
p = Pattern.compile("(\\s{2,})\\'");
m = p.matcher(s);
}
System.out.println(s);这几行代码貌似可以满足你的需求,你看看吧!如果有不足之处,望斧正。