2013-05-02 85 views
0

末鑑於此字符串1990January20hello.abc我想申請正則表達式來獲得最終的字符串1990January-20hello.abc的正則表達式修改開頭和行或字符串

我想我可以這樣做:

String text = "1990January20hello.abc"; 
Pattern p = Patter.compile("(.*)(January|Jan)(.*)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
Matcher m = p.matcher(text); 
while (m.find()){ 
    String val1 = m.group(2); 
    String val2 = val1.replace("$", "-"); 
    text = text.replace(val1, val2); 
} 

當我這樣做似乎在while循環中它確實找到「1月」,但val2和文本保持1月。我究竟做錯了什麼?它就好像Java不能識別$作爲行結束/字符串。理想情況下,我想說val1.replace(「(^ | $)」,「 - 」)所以我可以得到1990-一月-20hello.abc作爲最終字符串。請幫忙。提前感謝您的建議。

+1

你沒有很清楚地解釋規則。 「一月」可能是「一月」?或者它可以是任何其他的字符串?你想在第二個'\ d +'前添加一個'-'嗎?總是有兩套'\ d +'?此外,你給了你兩次預期的輸出,(在你的問題的開始和結束時),它們是不同的。 – Kent 2013-05-02 17:31:06

回答

0

使用此一模式:

(\d+)([A-Za-z]+)(\d+)(.*)

所得基團和它們的值是:

組1 = 1990, 第2組=一月, 第3組= 20, 組4 =字符串的其餘部分。

然後你可以將它們附加在一起,並添加任何你想要的。

0

String#replace不使用正則表達式,因此不匹配行字符的開始或結束。您可以使用的替代方法,它使用正則表達式,如replaceAll之一:

String text = "1990January20hello.abc"; 
Pattern p = Pattern.compile("(.*)(January|Jan)(.*)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
Matcher m = p.matcher(text); 
while (m.find()) { 
    String val1 = m.group(2); 
    String val2 = val1.replaceAll("$|^", "-"); 
    text = text.replace(val1, val2); 
} 

輸出:

1990-January-20hello.abc 
+0

我不認爲字符串理解所有的正則表達式模式,所以它不會識別($ | ^)模式。在while循環中,我不得不再次使用Pattern/Matcher並且工作。發佈我的問題的答案 – chapstick 2013-05-03 12:56:43

0

嘗試

String s = "1990January20hello.abc"; 
String s2 = s.replaceAll("(Jan|January)(\\d+)", "$1-$2"); 
System.out.println(s2); 

或者使用匹配器

String s3 = Pattern 
    .compile("(Jan|January)(\\d+)", Pattern.CASE_INSENSITIVE) 
    .matcher(s).replaceAll("$1-$2"); 
System.out.println(s3); 
0

字符串無法識別所有正則表達式模式,這就是爲什麼我的替換失敗。繼承人如何解決它:

String text = "1990January20hello.abc"; 
Pattern p = Patter.compile("(.*)(January|Jan)(.*)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
Matcher m = p.matcher(text); 
while (m.find()){ 
    String val1 = m.group(2); //"January" 
    Pattern p1 = Pattern.compile(^|$); 
    Matcher m1 = p1.matcher(val1); 
    String val2 = m1.replaceAll("-"); //"-January-" 
    text = text.replace(val1, val2); //"1990-January-20hello.abc" 
} 

謝謝您的反饋!