2013-04-04 60 views
0

我需要將標記之間的文本更改爲字符串中的大寫,然後使用更改後的字母打印整個字符串。所以將標記之間的文本更改爲大寫java

"asdasd <upcase>something</upcase> dfldkflskdf <upcase>stuff</upcase>skdlskd" would become: 
"asdasd SOMETHING dfldkflskdf STUFF skdlskd" 

到目前爲止,我得到了這個,但它只返回標籤的第一次發生的文本。

static String tags (String word) 
    { 
     String changed = word; 

     while (changed.indexOf("<upcase>") >= 0) 
       { 
       changed = (changed.substring(changed.indexOf("<upcase>")+"<upcase>".length(),changed.indexOf("</upcase>"))); 
       } 
     return changed.toUpperCase(); 
+1

除此之外,你應該不使用XML解析器來? – Reimeus 2013-04-04 16:31:34

+0

我知道我應該只是它的一個練習,我試圖解決。 – nailoxx 2013-04-04 16:35:30

+0

您近了,您需要跟蹤''的位置,然後使用'str.indexOf(「」,startPos)'。 – Supericy 2013-04-04 16:54:18

回答

0

首先,由於在upcase標籤之間可以有多個字符串,所以需要返回一個字符串集合。我選擇了一個列表。

其次,你需要使用String indexOf(string,pos)方法,所以你不會在XML字符串中失去你的位置。

這裏有一種方法可以做你想做的事。

public List<String> tags(String xml) { 
    List<String> list = new ArrayList<String>(); 
    String startTag = "<upcase>"; 
    String endTag = "</upcase>"; 
    int sPos = xml.indexOf(startTag); 
    while (sPos >= 0) { 
     int ePos = xml.indexOf(endTag, sPos + startTag.length()); 
     if (ePos >= 0) { 
      list.add(xml.substring(sPos + startTag.length(), ePos) 
        .toUpperCase()); 
     } 
     sPos = xml.indexOf(startTag, ePos + endTag.length()); 
    } 
    return list; 
} 
0

好吧,這裏是一個更新版本:

public static String tags(String xml) { 
    final String upcaseTagRegex = "<upcase>(.*?)</upcase>"; 
    String result = xml; 
    Pattern pattern = Pattern.compile(upcaseTagRegex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
    Matcher matcher = pattern.matcher(xml); 

    while(matcher.find()) { 
     result = result.replaceFirst(upcaseTagRegex, matcher.group(1).toUpperCase()); 
    } 

    return result; 
} 
從問題
+0

對不起,我沒有正確地問這個問題,我現在編輯它。正則表達式也打印標籤。我需要打印沒有標籤的整個更改的字符串。 – nailoxx 2013-04-05 08:01:46

+0

哦,是啊!貪婪的正則表達式存在一個錯誤。 – 2013-04-09 14:51:24