在Android中使用包含[] {}的输入重新定义表达式

时间:2016-04-22 09:10:32

标签: android regex

我正在尝试使用以下数据中的正则表达式提取X和Y组件:

{"SearchResults":[{"PageCount":"0"},
{"SEARCHVAL":"530106","CATEGORY":"Building",
    "X":"103.8907","Y":"1.3537"}]}

这是我试图无济于事的模式:

Pattern p1 = Pattern.compile("\\\"X:\\\"([0-9.]*)\\\",\\\"Y\\\":\"([0-9.]*)\\\"");  

Matcher m1 = p1.match(result);
if( m1.matches() ){
    print("match found");
}

我还试过以下但没有运气:

Pattern.compile("\"X:\"([0-9.]*)\",\"Y\":\"([0-9.]*)\"");

这应该很简单,但过去2个小时我一直被困在这里。

3 个答案:

答案 0 :(得分:1)

此RegEx将起作用:

"X":"([0-9.]*)","Y":"([0-9.]*)"

1st捕获组包含X值, 2nd捕获组包含Y

Live Demo on Regex101

这意味着您的Pattern.compile应为:

Pattern.compile("\"X\":\"([0-9.]*)\",\"Y\":\"([0-9.]*)\"");

请注意,您可能需要在RegEx开头添加.*才能使其正常工作。

答案 1 :(得分:1)

如果您希望正则表达式解析它,那么您可以使用:

"X":"(\d+(?:\.\d+)?)","Y":"(\d+(?:\.\d+)?)"

<强> Regex Demo

你的正则表达式中X后面缺少引号(")。虽然我建议不要使用正则表达式,因为它也会匹配1.1.2.3

JAVA

\"X\":\"(\\d+(?:\\.\\d+)?)\",\"Y\":\"(\\d+(?:\\.\\d+)?)\"

答案 2 :(得分:-1)

对于那些遇到同样问题的人来说,前端/末端需要。*的原因是因为我使用了错误的方法调用。

根据http://developer.android.com/reference/java/util/regex/Matcher.html#matches()

  

public boolean matches()

     

在API级别1中添加尝试将模式与整个模式匹配   区域(或整个输入,如果没有设置区域)。

需要匹配整个区域。

要做任何匹配,我需要使用find()代替。

  

public boolean find()

     

在API级别1中添加移动到下一个模式中   输入。如果先前的匹配成功,则该方法继续   从输入中匹配后的第一个字符进行搜索。   否则它会从区域开始搜索(如果有的话)   设置),或从位置0。

希望这对其他人有用。

String.matches()为matches()方法http://developer.android.com/reference/java/lang/String.html

提供了更多见解
  

public boolean matches(String regularExpression)

     

此方法仅在常规时返回true   expression匹配整个输入字符串。一个常见的错误是   假设此方法的行为类似于contains(CharSequence);如果你   想要匹配输入字符串中的任何位置,您需要添加。*   正则表达式的开头和结尾。见匹配(String,   CharSequence的)。