2011-12-02 171 views
0

你好,我想修改任何字符串为大写Underscore所做的有效变量。Java替换字符串的匹配部分中的字符

因此,举例来说,如果我有以下几点:

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 

首先我使用一个函数来创建大写的驼峰字符串下划线。

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

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

所以我的问题是如何产生所需的结果。有没有一个正则表达式可以让我成为任何字符串的有效变量?

有没有办法解决最后的样品?

+0

“是否有正则表达式可以让我成为任何字符串的有效变量?”号码 – FailedDev

+0

好,那么任何一种方法?样品?图书馆?我宁愿使用经过测试的东西,而不是创建我的东西,然后解决它可能存在的任何可能的问题。 – DArkO

+1

问题在于你的问题中的“任何”。任何东西都可以是字面意思。您需要提供涵盖全部或更多测试用例的更具体规则。那么解决方案可能是可行的。 – FailedDev

回答

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

我的正则表达式在http://stackoverflow.com/questions/6695624/use-regex-in-c-sharp-to-insert-spaces-between-concatenatedfilenameslikethis/6696031#6696031可以使用,如果首选的话,它处理更多的细节if这是OP想要的。 – Qtax

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