String tirm()方法去不掉的空格

删除String trim()方法去不掉的空格(中文(全角)空格)

需求

  • 移除掉下面代码中的空白行。
  • 移除每行前面的多余空白符

要处理的文本:

  BufferedReader in;

  Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");

  in = new BufferedReader(new FileReader("phone"));

  String s;

  while ((s = in.readLine()) != null)

  {

  Matcher matcher = pattern.matcher(s);

  if (matcher.find())

  {

  System.out.println(matcher.group());

  }

  }

  in.close();

移除空白行:使用正则表达式

使用String类的replaceAll()方法可以移除空白行,只要我用正则表达式匹配到这些空白行,然后把这些空白行替换为空字符串就行了。

text = text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");

(?m)表示开启多行匹配模式,^匹配行开头,\\s*0个或多个空白符,$匹配行结尾,(\\n|\\r\\n)匹配字符串中的换行符。

测试代码如下:

String text = SysClipboardUtil.getSysClipboardText();
System.out.println("去除无意义空白行后:");
text = text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");
System.out.println(text);

依赖:SysClipboardUtil.getSysClipboardText();
运行结果:

去除无意义空白行后:
  BufferedReader in;
  Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");
  in = new BufferedReader(new FileReader("phone"));
  String s;
  while ((s = in.readLine()) != null)
  {
  Matcher matcher = pattern.matcher(s);
  if (matcher.find())
  {
  System.out.println(matcher.group());
  }
  }
  in.close();
____________________________________

好的,第一个需求做到了。

移除每行前面的多余空白符

String.trim()方法删除不掉该空格符

现在text字符串中,每一行的前面有两个空白符:  ,因为这些空白符在行尾,很自然想到使用text.trim()方法取出掉该空白符,但是奇怪的是根本就去不掉。
之所以去不掉是因为这个空格不简单啊,不是普通那种空格,这里称为bug空格
bug空格:

普通空格:

可以看到这个bug空格比普通的空格的宽度要宽。不过也不是没有办法。

思路1:用该空格自己匹配来自己,进行替换删除

不过既然这个bug空格可以复制粘贴,那我就直接粘贴到程序中,用它自己来匹配自己,这样使用text.replaceAll("[ ]+","")就可以把这个bug空格" "全部替换成空白字符串"",就相当于删除掉该字符串了。
代码如下:

String text = SysClipboardUtil.getSysClipboardText();
//删除文本中的空白行
text=text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");
System.out.println("删除空白行之后的文本:");
System.out.println(text);
//直接粘贴这个空格到字符组中,
text=text.replaceAll("[ ]+", "");
System.out.println("_______________________________");
System.out.println("去除中文全角空格后:");
System.out.println(text);

复制需要处理的文本,然后运行上面的代码。运行结果如下。

删除空白行之后的文本:
  BufferedReader in;
  Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");
  in = new BufferedReader(new FileReader("phone"));
  String s;
  while ((s = in.readLine()) != null)
  {
  Matcher matcher = pattern.matcher(s);
  if (matcher.find())
  {
  System.out.println(matcher.group());
  }
  }
  in.close();
_______________________________
去除中文全角空格后:
BufferedReader in;
Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");
in = new BufferedReader(new FileReader("phone"));
String s;
while ((s = in.readLine()) != null)
{
Matcher matcher = pattern.matcher(s);
if (matcher.find())
{
System.out.println(matcher.group());
}
}
in.close();

可以看到用了这种傻瓜式的操作就可以完成任务了。不过还是有点心有不甘,因为不知道这个bug空格是什么东西,下面来看看这个bug空格到底是什么东西。

思路2:转成Unicode码然后查码表看看是什么东西

查了一下,其实这个空格叫做中文(全角)空格,我怎么知道的呢。先把这个空格转换成Unicode字符就知道了。
代码如下

String chinese_full_width_space=" ";//中文全角空格
String urlEncoderUnicode = URLEncoder.encode(chinese_full_width_space,"utf-16be");//java中的字符都用utf-16be进行编码,所以转码为utf-16be我们就知道了这个奇怪的字符在java里的编码。这样方便后面查找。
System.out.println(urlEncoderUnicode);

运行结果:

%30%00

%30%00转换成平常表示的java中的Unicode编码就是\u3000,然后再到网上查一下看看这个\u3000是什么:

嗯,原来这个bug空格叫做中文全角空格

好的,既然我们知道了这个奇怪的空格是中文全角空格,也知道对应的Unicode码为\u3000,java中正则表达式支持Unicode码,所以可以使用text=text.replaceAll("\u3000+", "");把所以的中文全角空格替换成空字符,也就是移除掉所有的中文全角空格了。

    String text = SysClipboardUtil.getSysClipboardText();
    //删除文本中的空白行
    text=text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");
    System.out.println("删除空白行之后的文本:");
    System.out.println(text);
    //直接粘贴这个空格到字符组中,
//  text=text.replaceAll("[ ]+", "");
//    使用Unicode码匹配中文全角空格
    text=text.replaceAll("\u3000+", "");
    System.out.println("_______________________________");
    System.out.println("去除中文全角空格后:");
    System.out.println(text);

运行结果:

删除空白行之后的文本:
  BufferedReader in;
  Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");
  in = new BufferedReader(new FileReader("phone"));
  String s;
  while ((s = in.readLine()) != null)
  {
  Matcher matcher = pattern.matcher(s);
  if (matcher.find())
  {
  System.out.println(matcher.group());
  }
  }
  in.close();
_______________________________
去除中文全角空格后:
BufferedReader in;
Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");
in = new BufferedReader(new FileReader("phone"));
String s;
while ((s = in.readLine()) != null)
{
Matcher matcher = pattern.matcher(s);
if (matcher.find())
{
System.out.println(matcher.group());
}
}
in.close();

启发

遇到一个不懂的字符的时候可以先把它转为Unicode码,然再查码表,或者网上查。

你可能感兴趣的:(String tirm()方法去不掉的空格)