3

我试图用来replaceAll消除字符串中的所有空格,但两个区域除外。

如果我的字符串是

AB CD #E     F# #GH   I# JK L   M

然后我希望它输出为

ABCD#E     F##GH   I#IJKLM

目前,它是在ABCD#EF##GH#IJKLM不区分#字符的情况下输出。有没有办法用replaceAll上的正则表达式来做到这一点?

String s1 = "AB CD #E     F# #GH   I# JK L   M";
s1 = s1.replaceAll("\\s+", "");
System.out.println(s1);
4

3 回答 3

3

我不擅长正则表达式。我将为此使用一个循环。

String s1 = "AB CD #E     F# #GH   I# JK L   M";
StringBuilder sb = new StringBuilder();
boolean keepSpace = false;
for(int i = 0; i < s1.length; i++){
    char c = s1.charAt(i);
    if(keepSpace || c != ' ')
        sb.append(c);
    if(c == '#')
        keepSpace = !keepSpace;
}
s1 = sb.toString();
System.out.println(s1);
于 2013-04-16T14:06:01.823 回答
3

您正在寻找这种基于正则表达式的正则表达式replaceAll

String repl = str.replaceAll("\\s+(?=(?:(?:[^#]*#){2})*[^#]*$)", "");

现场演示:http: //ideone.com/nFQhVt

说明:此正则表达式使用正向前瞻,基本上匹配出现 0 次或多次出现的一对文本,直到找到哈希 (#),即([^#]*"){2}在每个空格匹配的右侧 (RHS)。

[^#]*#简而言之,这意味着仅当它位于哈希符号对之外时才替换空格,因为哈希内的所有匹配项在 RHS 上都将具有奇数个匹配项。

于 2013-04-16T14:12:33.687 回答
1

尝试

s1 = s1.replaceAll("\\s+(?=(?:[^#]*#[^#]*#)*[^#]*$)", "");

#只有当字符串中有偶数个前面时,它才会替换空格。
因此,它远非万无一失,但它可能已经足够好了。
您总是可以先测试字符串以确保它包含偶数个#.

于 2013-04-16T14:03:39.053 回答