Java替换字符串匹配部分中的字符

时间:2011-12-02 10:13:49

标签: java regex replace

您好我正在尝试将任何字符串修改为使用Uppercase Underscore创建的有效变量。

例如,如果我有以下内容:

configGlossary:poweredByIcon -> CONFIG_GLOSSARY_POWERED_BY_ICON

124$32SomeSampleString_thatI_have -> SOME_SAMPLE_STRING_THAT_I_HAVE

myJSP -> MY_JSP but my regex produces MY_J_S_P

首先我使用函数从camelCase字符串创建大写下划线。

到目前为止,我已经能够为除了最后一个结果示例之外的所有内容以及字符串开头有数字的情况实现所需的结果。我有以下正则表达式。这将删除多个下划线(如果有的话)。

 String regex = "s/^[^a-zA-Z_]+|[^a-zA-Z_0-9]";
 String result = variableName.replaceAll(regex, "_").replaceAll("\\_+", "_");

所以我的问题是如何产生所需的结果。是否有正则表达式,使我成为任何字符串的有效变量?

有没有办法解决最后一个样本?

2 个答案:

答案 0 :(得分:2)

这适用于您提供的样本:

public static String toVar(String str){
    str = str.replaceAll("^[^a-zA-Z_]+", "");
    str = str.replaceAll("[^a-zA-Z_0-9]+", "_");
    str = str.replaceAll("(?<=[a-z])(?=[A-Z])", "_");
    return str.toUpperCase();
}

<强> Sample

String s;
s = "myJSON";
System.out.println(s + " -> " + toVar(s));

s = "configGlossary:poweredByIcon";
System.out.println(s + " -> " + toVar(s));

s = "124$32SomeSampleString_thatI_have";
System.out.println(s + " -> " + toVar(s));

输出:

myJSON -> MY_JSON
configGlossary:poweredByIcon -> CONFIG_GLOSSARY_POWERED_BY_ICON
124$32SomeSampleString_thatI_have -> SOME_SAMPLE_STRING_THAT_I_HAVE

答案 1 :(得分:1)

我在这个gist中拼凑了一个快速且非常脏的解决方案。我担心,您的问题没有通用的解决方案或库,因为您的任务对您的问题域非常具体。希望尽管有所帮助。

脚本的输出如下:

working for: configGlossary:poweredByIcon, got CONFIG_GLOSSARY_POWERED_BY_ICON
working for: 124$32SomeSampleString_thatI_have, got SOME_SAMPLE_STRING_THAT_I_HAVE
working for: myJSP, got MY_JSP