2011-12-02 252 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