复杂字符串的正则表达式

时间:2013-08-27 17:06:24

标签: java regex

我是regexp的新手。我需要验证字符串,但是当我使用当前的尝试时,它总是返回false。

规则:

  1. 像“polygon(())”
  2. 这样的文本匹配器
  3. 数字匹配器,如X Y,其中x和y可以是任何双数
  4. 尽可能多的X Y对,用逗号分隔。
  5. 例如:

    PolyGoN((
    -74.0075783459999 40.710775696, 
    -74.007375926 40.710655064, 
    -74.0074640719999 40.7108592490001, 
    -74.0075783459999 40.710775696))
    

    以下是我使用的代码:

    String inputString = "POLYGON((-74.0075783459999 40.710775696, -74.007375926 40.710655064, -74.0072836009999 40.710720973, -74.0075783459999 40.710775696))";
    String regexp = "polygon[\\((][(\\-?\\d+(\\.\\d+)?)\\s*(\\-?\\d+(\\.\\d+)?)]*[\\))]";
    Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputString);
    boolean result = matcher.matches();
    

2 个答案:

答案 0 :(得分:3)

[\\((]是指定您需要(两次的错误方法。无论你重复一个角色多少次但在一个角色类[]内,它只计算一次。因为它是同一个字符重复你甚至不需要一个字符类,只有字符\\(有一个量词,告诉它应该重复多少次{2}。因此,您需要在开始时\\({2}和最后\\){2}

使用[]的另一个问题是,您使用它们来表示一组重复的双对(使用*)。您始终使用()对匹配的一部分进行分组。 []仅表示字符类。我想知道为什么你错了,因为你正确地分组你的双打和他们的对。

接下来,您已忘记匹配分隔双对的所有逗号,。我在我的正则表达式中将(,\\s*)?包括在内。连字符-(或此处的否定符号)不需要转义,因为它不在字符类[]内,因此正则表达式解析器知道你的错误不使用它来指定字符范围。

更正的正则表达式是(为了清晰起见,缩进)

polygon\({2}\s*(
    (-?\d+(\.\d+)?)\s*(-?\d+(\.\d+)?)(,\s*)
  )*(-?\d+(\.\d+)?)\s*(-?\d+(\.\d+)?)
\s*\){2}

答案 1 :(得分:0)

m|Polygon\(\(((\s*-?\d+\.\d+\s*){2},)*(\s*-?\d+\.\d+\s*){2}\)\)|i