我是正则表达式的新手。我需要验证一个字符串,但是当我使用当前的尝试时,它总是返回 false。
规则:
- 像“polygon(( ))”这样的文本匹配器
- 数字匹配器,如 X Y,其中 x 和 y 可以是任意双数
- 尽可能多的 X Y 对,以逗号分隔。
例如:
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}
。因此,您需要在开头使用 \\({2}
),在以下位置使用 \\){2}
结束。
使用 []
的另一个问题是,您使用它们来表示一组重复的双对(使用 *
)。您始终使用 ()
对比赛的一部分进行分组。 []
仅表示字符类。我想知道为什么你会犯这个错误,因为你正确地对 double 及其配对进行了分组。
接下来,您忘记匹配所有分隔双对的逗号 ,
。我已将其作为 (,\\s*)?
包含在我的正则表达式中。连字符 -
(或此处的负号)不需要转义,因为它不在字符类 []
内,因此正则表达式解析器知道您不是使用它来指定字符范围。
更正后的正则表达式为(为了清晰起见,缩进)
polygon\({2}\s*(
(-?\d+(\.\d+)?)\s*(-?\d+(\.\d+)?)(,\s*)
)*(-?\d+(\.\d+)?)\s*(-?\d+(\.\d+)?)
\s*\){2}
关于java - 复杂字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471551/