替换字符串中的特殊字符

时间:2013-12-02 20:55:43

标签: java groovy str-replace

我在SO上看到了很多关于这个问题的Q& A。我已经使用了一些例子,但有些东西不能正常工作:

def input = 'now is thé timé'
println Normalizer.normalize(input, Normalizer.Form.NFD).replaceAll(/[^A-z0-9 ]/, "").replaceAll(/ +/, "-")

以上的输出是

now-is-th-tim

如果我执行以下操作:

String input = 'now is th\u00E9 tim\u00E9'
println Normalizer.normalize(input, Normalizer.Form.NFD).replaceAll(/[^A-z0-9 ]/, "").replaceAll(/ +/, "-")

我得到了

now-is-the-time

这就是我想要的。我甚至尝试了以下方法:

def input = groovy.json.StringEscapeUtils.escapeJavaScript('now is thé timé')
println Normalizer.normalize(input, Normalizer.Form.NFD).replaceAll(/[^A-z0-9 ]/, "").replaceAll(/ +/, "-")

但我得到

now-is-th\u221A\u00A9-tim\u221A\u00A9

有什么建议吗?

更新:根据评论,我尝试了以下内容:

import java.text.Normalizer

def input = new File('file.txt').text
def results = Normalizer.normalize(input, Normalizer.Form.NFD).replaceAll(/[^A-z0-9 ]/, "")
    .replaceAll(/ +/, "-")
println results

file.txt包含我在字符串中放置的文本。这是按预期工作的。因此,在groovy中对字符串定义进行编码会发生一些事情。

1 个答案:

答案 0 :(得分:2)

鉴于您的第二个代码段有效,我强烈怀疑对于第一个代码段,您在编辑器中使用的编码与Groovy解释器/编译器正在使用的编码不同。

换句话说,问题不在代码的 second 行中 - 它位于 first 行中。你不是从你认为的输入文本开始的。