【问题标题】:What's wrong with my regex -?\\d{2}\\.?\\d{6}我的正则表达式有什么问题 -?\\d{2}\\.?\\d{6}
【发布时间】:2014-09-18 19:56:41
【问题描述】:

我正在尝试从网址中提取经纬度:

资源: ...sensor=false&center=-15.842208999999999%2C-48.023084&zoom=17&size=256x256&language=en&client=google-maps-frontend&signature=hbey3U4lycTNgX48asW8MODjJLM

我不擅长正则表达式,所以我使用了这个正则表达式测试器 (http://regexpal.com/) 并编写了这个正则表达式

-?\d{2}\.?\d{6}
(适用于 JAVA)

它产生这个结果(谁说它是 regexpal.com):

-15.842208 ... -48.023084

所以当我这样做时(在 java 中):

for (Element element : newsHeadlines) {
        if(element.toString().contains("https://maps.google.com")){
            List<String> lista = get_matches(element.attr("content"), "-?\\d{2}\\.?\\d{6}");


        }
    }

public static List<String> get_matches(String s, String p) {
    // returns all matches of p in s for first group in regular expression 
    List<String> matches = new ArrayList<String>();
    Matcher m = Pattern.compile(p).matcher(s);
    while(m.find()) { 
        matches.add(m.group(1)); //<-- Exception m.group(1) not have any results.
    }
    return matches;
}

我的正则表达式有什么问题?

【问题讨论】:

  • 为什么将- 作为可选的?试试-\d{2}\.?\d{6}-?\d{2}\.\d{6}
  • 很好,有你的建议和一点安排,我终于修好了,谢谢。

标签: java android regex eclipse netbeans


【解决方案1】:

只需将一个符号设为可选,无论是- 还是.

-\d{2}\.?\d{6}

等效的 java 正则表达式:

-\\d{2}\\.?\\d{6}

-?\d{2}\.\d{6}

等效的 java 正则表达式:

-?\\d{2}\\.\\d{6}

DEMO

并调用m.group(0) 仅打印匹配的字符串。如果您想调用m.group(1),则需要将模式括在括号内。

【讨论】:

    【解决方案2】:

    您的方法get_matches 正在寻找m.group(1) 组在正则表达式中用括号定义。所以你的正则表达式需要是这样的:

    (-?\\d{2}\\.?\\d{6})
    

    Online Demo

    【讨论】:

    • 如果后面跟多于 6 位就不行了。见regex101.com/r/bL1cV0/3
    • @AvinashRaj 原始正则表达式明确要求 6 位数字,问题是关于 Exception m.group(1) 而不是正则表达式本身
    • 你尝试过他的实际输入吗?是的,我同意他尝试打印组 (1),但没有。
    • 问题不仅在于代码,还在于正则表达式。
    • @AvinashRaj 感谢您分享您的 POV。我注意到你已经提出了你的答案,如果你是正确的,那就会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多