从长字符串中提取文本并存储在变量中

时间:2014-05-03 20:18:55

标签: java android regex string

我正在为学校开发一个android项目。我们在editText中给出了转义的xml,我可以从editText中读取文本,但我想要的是从中捕获值。例如,这是在editText:

<ResponseSummary> 
<ID>spq789pie</ID> 
<No>305</No> 
<ItemCount>1</ItemCount> 
<Total>1.00</Total> 
</ResponseSummary> 

我打算做的是String response = edtResponse.getText().toString()从editText中捕获txt。我想做的是这样的事情:

string test = (some expression that searches text and return a value text from a string)
if (test = "ID"){setID(ID);}
else if(No = "No"){setNo(No);}
else if(ItemCount = "ItemCount"){setItemCount(ItemCount);}
else if(Total = "Total"){setTotal(Total);}

基于上面的xml,我希望最后的值看起来像这样:

ID = spq789pie
No = 305
ItemCount = 1
Total = 1.00

如果你能帮助我,我真的很感激。我已经读过正则表达式的工作,但我对正则表达式并不是很好。如果还有其他方法,我也会这样做。

感谢您的所有帮助。

3 个答案:

答案 0 :(得分:1)

您可以使用:

Matcher m = Pattern.compile("(?:<ResponseSummary>|(?!^)\\G)\\s*"
                          + "&lt;(?<key>(?>[^&]++|&(?!gt;))*)&gt;"
                          + "(?<value>(?>[^&]++|&(?!lt;))*)"
                          + "&lt;/\\1&gt;").matcher(txt);
while (m.find()) {
    System.out.println(m.group("key") + " = " + m.group("value"));
}

\G锚代表字符串的开头或最后一场比赛的结尾。否定前瞻(?!^)用于排除第一种情况。

答案 1 :(得分:0)

由于您的数据已经是XML格式,我建议使用XML解析器,而不是使用正则表达式。 Android有一个名为XmlPullParser的内置解析器,非常容易使用。

以下是有关Android上的XML解析的更深入的指南:Parsing XML Data | Android Developers

答案 2 :(得分:0)

如果您希望将此作为字符串使用而不是像建议的savanto那样使用XML,则可以这样做(使用尽可能简单的正则表达式):

    String[] lines = response.split("[\n]");
        // you split the string to lines (new line char is the thing that splits the string)

    String[] line = null;
    String key = null;
    String closureKey = null;
    String strValue = null;

    for (int i = 0; i < lines.length; ++i) {
        line = lines[i].split("[&][lg][t][;]");
            // you split every single line with specific string:
            // first char is '&', second char is either 'l' or 'g'
            // third char is 't', forth is ';'

        key = line[1];
            // line array will start and end with an empty string so you take the element with index 1, NOT 0

        if (i == 0)
        {
            // do so something with the parent key
        }
        else if (i == lines.length - 1)
        {
            // check if parent closure key is correct
        }
        else
        {
            strValue = line[2];
            closureKey = line[3];

            if (key.equals("ID"))
            {
                // do something; value is in strValue
            }
            else if (key.equals("ItemCount"))
            {
                // do something; value is in strValue
            }
            //and so on...


            if (!closureKey.equals("/" + key))
            {
                // something is wrong with this child's closure key
            }
        }
    }