在Android中使用正则表达式提取更多字符串

时间:2013-03-06 23:46:36

标签: java android regex

输入是这样的:

String text = "{\"definitions\":[{\"id\":\"com.sample.evaluationa\",\"name\":\"Evaluationa\",\"vers}{\"id\":\"com.sample.evaluationb\",\"name\":\"Evaluationb\",\"vers}";

一些引用使其更透明

String definitions = "{\"definitions\":[";
String id = "{\"id\":\"";
String name = "\",\"name\":\"";
String rest = "\",\"vers}";

我的正则表达式如下:

Pattern pattern = Pattern.compile((Pattern.quote(definitions)) +"("+ (Pattern.quote(id)) +"(.+)" +(Pattern.quote(name))+"(.+)"+(Pattern.quote(rest))+")*");

我正在寻找id(#.sample.evaluation)

Matcher regexMatcher = pattern.matcher(text);
    while (regexMatcher.find()) {
        title = regexMatcher.group(2);
        System.out.println(title);
        System.out.println("The pattern is " + pattern.pattern());
    }

我的输出如下:

com.sample.evaluationa","name":"Evaluationa","vers}{"id":"com.sample.evaluationb
The pattern is \Q{"definitions":[\E(\Q{"id":"\E(.+)\Q","name":"\E(.+)\Q","vers}\E)*

但我想:

com.sample.evaluationacom.sample.evluationb

在周期中改变目标群体之后,还有什么有趣但不是很好的方式

title = regexMatcher.group(2);

我得到了(当然还有模式线)

Evaluationb

2 个答案:

答案 0 :(得分:1)

.+表示 1 无限字符,而且正则表达式引擎默认为贪婪,因此它将匹配尽可能多的字符可能的。

最好定义你可以期待的字符类:
[a-z\.]+id[A-Z][a-z]+name 这些将自行工作,因为当\正在使用正则表达式引擎时,\不属于最后一个类

如果您出于任何原因想要使用.+但请尽早停止添加?,这样会切换到懒惰行为。 (例如.+?

答案 1 :(得分:0)

您可以在java中处理该字符串,只需下载Apache commons lang库 并将commons-lang3-3.1.jar文件粘贴到 libs 文件夹

并像这样使用

String formatedjsonstring=StringEscapeUtils.unescapeJava(yourjsonstring);

不要让事情变得复杂。使用这个库会自动取消字符

java转义后,角色会像这样创建Json对象

JSONObject obj=new JSONObject(formatedjsonstring);
JSONArray jsonArray=obj.getJSONArray("definitions");

使用for循环来解析那些json对象

for(int i=0;i<jsonArray.length();i++)
{
JSONObject obj=jsonArray.getJSONObject(i);
String id=obj.getString("id");
}