从字符串

时间:2017-09-22 10:20:36

标签: java android regex unicode

我正在尝试在字符串中的0索引处获取字符:

public static String editNoHP (String noHP){
  String result;
  try {
      if(noHP.charAt(0) == '0')
          result = "62"+noHP.substring(1);
      else if(noHP.charAt(0) == '+' )
          result = noHP.substring(1);
      else if(noHP.charAt(0) == '6')
          result = noHP;
      else if(noHP.charAt(0) == '6' && noHP.charAt(1) == '2')
          result = noHP;
      else if(noHP.charAt(0) == '9')
          result = noHP;
      else
          result = "62"+noHP;
  }
  catch (Exception e){
      return "";
  }

  return result.replaceAll("[\\s\\-\\.\\^:,]","");
}

所以我在查询联系后使用此函数,但我发现了奇怪的结果。

正常输入&输出:

input = +62 111-1111-1111   output : 6211111111111
input = 011111111111        output : 6211111111111

这是奇怪的输入和结果:

input = 011111111111        output : 62011111111111

所以我尝试调试这个帐户,我发现当app尝试将字符设为0时,返回的是'\ u202A'8234,而不是0。

我已经尝试过RegEx:

String clean = str.replaceAll("[^\\n\\r\\t\\p{Print}]", ""); or
String clean = str.replaceAll("[^\\x20-\\x7E]", ""); or
String clean = str.replaceAll("[^\u0000-\uFFFF]", ""); or
String clean = str.replaceAll("[^\\p{ASCII}]", ""); or
String clean = str.replaceAll("[^\x00-\x7F]", ""); or
String clean = StringEscapeUtils.unescapeJava(str);

所有这些都返回相同的值'\ u202A'8234。

这个角色是什么? 如何解决这个问题?

更新: 我尝试编辑这个奇怪的联系人,我发现了奇怪的行为。数字是011111111111.首先我将光标放在0和1之间,然后我按删除/退格键删除0.光标突然移动到数字1的右边而不是左边。然后我保存联系人并运行我的程序。结果是0,而不是'\ u202A'8234。所以我认为这是因为数字格式不正常,可能是第一次添加此联系人或从谷歌帐户同步时。

2 个答案:

答案 0 :(得分:1)

根据http://unicode.org/cldr/utility/character.jsp?a=202A&B1=Show \u202A是一种空白。 为了修复它,只需修剪弦。

public static String editNoHP (String noHP){
     noHP = noHP.trim();
     // the rest of your code...
}

答案 1 :(得分:1)

最后,我发现我可以使用正则表达式替换非字母数字字符。

所以这是我的结局功能:

public static String editNoHP (String noHPinput){
    String result;
    try {
        noHPinput = noHPinput.trim();
        String noHP = noHPinput;
        noHP = noHP.replaceAll("[\\s\\-\\.\\^:,]","");
        noHP = noHP.replaceAll("[^A-Za-z0-9]","");
        char isinya = noHP.charAt(0);

        if(isinya == '0')
            result = "62"+noHP.substring(1);
        else if(isinya == '+' )
            result = noHP.substring(1);
        else
            result = noHP;

    }
    catch (Exception e){
        return "";
    }

    return result;
}

此正则表达式删除字母数字字符旁边的所有unicode字符。