黑马程序员技术交流社区

标题: 如何去掉包含全角空格的字符串的前后全角字符串? [打印本页]

作者: 郭学文    时间: 2011-11-9 14:38
标题: 如何去掉包含全角空格的字符串的前后全角字符串?
比如一个字符串:

半角空格 全角空格 字符串欲保(全角空格) 留的(半角空格)内容 半角空格 全角空格 半角空格 全角空格  

半角空格即半角空格,全角即全角,呵呵,好多废话。空格看不见,就用字来表示了

现在要保留绿色的部分
测试发现trim()只能去掉半角的,全角的去不掉

有没有什么简单的办法?

作者: 海林    时间: 2011-11-9 15:05
public String trim() {
        int len = count;
        int st = 0;
        int off = offset;      /* avoid getfield opcode */
        char[] val = value;    /* avoid getfield opcode */

        while ((st < len) && (val[off + st] <= ' ')) {
            st++;
        }
        while ((st < len) && (val[off + len - 1] <= ' ')) {
            len--;
        }
        return ((st > 0) || (len < count)) ? substring(st, len) : this;
    }

这是trim()的源代码。我做测试的时候全角的也能去掉的。(你说的全角是不是在输入法状态下得空格?)我用得就是输入法下得空格。能去的掉
作者: 柴亚飞    时间: 2011-11-9 15:07
可以用正则表达式的方式分离出这个字符串。

作者: 柴亚飞    时间: 2011-11-9 15:08
split()方法中传入你想要的正则表达式。
作者: 石宗银    时间: 2011-11-9 15:18
s =s.replace(" ", "");
s = s.replace(" ", "");
用replace方法,,把全角半角的都去了。。包括中间的
而如果只去 前、后的,,那就要 用两个简单的算法了。。
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 String s = "   大中华    1   ";
  4.                 System.out.println("原始的字符:");
  5.                 System.out.println(s);
  6.                 s=s.trim();//先去掉前后的半角空
  7.                 // s =s.replace(" ", "");
  8.                 // s = s.replace(" ", "");
  9.                 char[] ch = s.toCharArray();
  10.                 boolean flag = false;//首位为全角空格=true
  11.                 for (int i = 0; i < s.length(); i++) {
  12.                         if (i==0) {
  13.                                 if (ch[i]==' ') {
  14.                                         ch[i]=' ';
  15.                                         flag = true;
  16.                                         continue;
  17.                                 } else {
  18.                                         flag = false;
  19.                                         break;
  20.                                 }
  21.                         }
  22.                         if (flag&&i>0) {
  23.                                 if (ch[i] == ' ') {
  24.                                         flag = true;
  25.                                         ch[i]=' ';
  26.                                 } else {
  27.                                         flag = false;
  28.                                 }
  29.                         }
  30.                 }
  31.                 s= new String(ch).trim();//把前面的半角空 去了
  32.                
  33.                 char[] cc = s.toCharArray();
  34.                 for (int i = s.length()-1; i >=0; i--) {
  35.                         if (i==s.length()-1) {
  36.                                 if (cc[i]==' ') {
  37.                                         cc[i]=' ';
  38.                                         flag = true;
  39.                                 } else {
  40.                                         flag = false;
  41.                                         break;
  42.                                 }
  43.                         }
  44.                         if (flag&&i<s.length()-1) {
  45.                                 if (cc[i] == ' ') {
  46.                                         flag = true;
  47.                                         cc[i]=' ';
  48.                                 } else {
  49.                                         flag = false;
  50.                                 }
  51.                         }
  52.                 }
  53.                 s= new String(cc).trim();//去了后面的半角空
  54.                 System.out.println("去掉了前后的半角、全角空格后:");
  55.                 System.out.println(s);
  56.         }
  57. }
复制代码

作者: 海林    时间: 2011-11-9 15:26
石宗银 发表于 2011-11-9 15:18
s =s.replace(" ", "");
s = s.replace(" ", "");
用replace方法,,把全角半角的都去了。。包括中间的

厉害    向你学习
作者: 郭学文    时间: 2011-11-9 15:26
本帖最后由 郭学文 于 2011-11-9 15:37 编辑
石宗银 发表于 2011-11-9 15:18
s =s.replace(" ", "");
s = s.replace(" ", "");
用replace方法,,把全角半角的都去了。。包括中间的


我之前也是这么想的,这样会把中间想要留下来的也去掉
我是把所有全角全换成半角,再trim(),然后再把半角换回全角
然后又有问题了,原来中间要保留的半角也变成了全角............

我是用end startsWith递归做的,就是觉得太麻烦了
想找个简单些的,你这样做比递归还复杂.........
作者: 郭学文    时间: 2011-11-9 15:33
本帖最后由 郭学文 于 2011-11-9 15:35 编辑
柴亚飞 发表于 2011-11-9 15:08
split()方法中传入你想要的正则表达式。


第一反应就是用正则,可是你说的想要的表达示得如何写?
\s 会连中间的也弄没了.....
作者: 石宗银    时间: 2011-11-9 16:02
本帖最后由 石宗银 于 2011-11-9 16:06 编辑
郭学文 发表于 2011-11-9 15:26
我之前也是这么想的,这样会把中间想要留下来的也去掉
我是把所有全角全换成半角,再trim(),然后再把半角换 ...


那就递归吧,,总归要有一个方法来处理的。。String自带的方法不能直接处理啊
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 String s = "    大中华    中   ";
  4.                 System.out.println(s);
  5.                 s = subtract(s.trim());//去掉两边半角空格,传进去
  6.                 System.out.println(s);
  7.         }
  8.         static String subtract(String s) {
  9.                 if(s.startsWith(" ")) {
  10.                         s = s.substring(1,s.length());
  11.                         s = subtract(s);
  12.                 }
  13.                 if(s.endsWith(" ")) {
  14.                         s = s.substring(0,s.length()-1);
  15.                         s = subtract(s);
  16.                 }
  17.                 return s.trim();//递归处理后可能还有半角空,所以再trim()下
  18.         }
  19. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2