0

我是正则表达式的新手。我需要验证一个字符串,但是当我使用我当前的尝试时,它总是返回 false。

规则:

  1. 像“polygon(())”这样的文本匹配器
  2. 像 XY 这样的数字匹配器,其中 x 和 y 可以是任何双精度数
  3. 尽可能多的 XY 对,以逗号分隔。

例如:

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();
4

2 回答 2

3

[\\((]指定您需要(两次的方式不正确。无论您重复一个字符多少次,但在一个字符类[]中它只计算一次。因为,它是相同的字符重复,你甚至不需要一个字符类,而只需要一个\\(带有量词的字符,它告诉它应该重复多少次{2}。所以,你需要\\({2}在开始和\\){2}结束时。

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

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

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

polygon\({2}\s*(
    (-?\d+(\.\d+)?)\s*(-?\d+(\.\d+)?)(,\s*)
  )*(-?\d+(\.\d+)?)\s*(-?\d+(\.\d+)?)
\s*\){2}
于 2013-08-27T17:14:13.813 回答
0
m|Polygon\(\(((\s*-?\d+\.\d+\s*){2},)*(\s*-?\d+\.\d+\s*){2}\)\)|i
于 2013-08-27T17:14:09.203 回答