从字符串中替换非ASCII字符

rah*_*sri 67 java regex

我有一个字符串 A função,Ãugent在我需要更换字符像ç,ã,Ã空字符串.

如何只匹配那些非ASCII字符?

我正在使用一个功能

public static String matchAndReplaceNonEnglishChar(String tmpsrcdta)
    {
        String newsrcdta = null;
        char array[] = Arrays.stringToCharArray(tmpsrcdta);
        if (array == null)
            return newsrcdta;

        for (int i = 0; i < array.length; i++)
        {           
            int nVal = (int)array[i];
            boolean bISO = Character.isISOControl(array[i]); // Is character ISO control
            boolean bIgnorable = Character.isIdentifierIgnorable(array[i]); // Is Ignorable identifier
            // Remove tab and other unwanted characters..
            if (nVal == 9 || bISO || bIgnorable)
                array[i] = ' ';
            else if (nVal > 255)
                array[i] = ' ';
        }
        newsrcdta = Arrays.charArrayToString(array);

        return newsrcdta;
    }
Run Code Online (Sandbox Code Playgroud)

但它没有正常工作......需要多大改进...这里我还有一个问题是最后的字符串被空格字符替换,这会在字符串中创建额外的空间.

Fai*_*Dev 145

这将搜索并替换所有非ASCII字母:

String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");
Run Code Online (Sandbox Code Playgroud)

  • 您很可能也想要删除不可打印和控制字符.在这种情况下,你将使用以下正则表达式:`"[^ \\ x20 - \\ x7E]"`或简单地说:""[^ - 〜]"` (37认同)
  • `"[^\\p{ASCII}]"` 是 `"[^\\x00-\\x7F]"` 的等效替代。 (3认同)
  • @rahulsri A是一个完全有效的ASCII字符.为什么要更换? (2认同)

Mic*_*ing 67

FailedDev的答案很好,但可以改进.如果要保留ascii等效项,则需要先进行规范化:

String subjectString = "öäü";
subjectString = Normalizer.normalize(subjectString, Normalizer.Form.NFD);
String resultString = subjectString.replaceAll("[^\\x00-\\x7F]", "");

=> will produce "oau"
Run Code Online (Sandbox Code Playgroud)

这样,像"öäü"这样的字符将被映射到"oau",这至少会保留一些信息.如果没有规范化,生成的String将为空.

  • 你的答案很好,但可以改进.在代码中删除Regex的使用并用for循环替换它是非常快的(20-40x).更多信息:http://stackoverflow.com/a/15191508/2511884 (4认同)
  • 您可能想使用 Normalizer.Form.NFKD 而不是 NFD - NFKD 会将诸如连字之类的内容转换为 ascii 字符(例如 fi 到 fi),NFD 不会这样做。 (2认同)

ste*_*ema 19

这将是Unicode解决方案

String s = "A função, Ãugent";
String r = s.replaceAll("\\P{InBasic_Latin}", "");
Run Code Online (Sandbox Code Playgroud)

\p{InBasic_Latin}是一个包含以Unicode范围内的所有字母的Unicode块U + 0000..U + 007F(参照regular-expression.info)

\P{InBasic_Latin} 被否定了 \p{InBasic_Latin}

  • (注意像我这样困惑的人:大写\ P是否定.) (5认同)
  • @ user1187719,你可能比"这不行"更精确.这个答案已经收到了一些赞成,所以它不能完全没用.当然,如果你在[Java 7]之前有一个Java版本(http://docs.oracle.com/javase/tutorial/essential/regex/unicode.html),那么我同意.正则表达式中的Unicode不能在那里工作. (2认同)