java - 复杂字符串的正则表达式

标签 java regex

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

规则:

  1. 像“polygon(( ))”这样的文本匹配器
  2. 数字匹配器,如 X Y,其中 x 和 y 可以是任意双数
  3. 尽可能多的 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/

相关文章:

正则表达式空字符串或电子邮件

Javascript 正则表达式表示年份

java - 使用 ReentrantLock 避免死锁

scala - 在 OSX Lion for Scala 上安装 JDK

java - 如何通过 TensorFlowInferenceInterface.java 提供 boolean 值占位符?

javascript - 如何理解这个正则表达式模式

java - 如何使用Java多线程概念将多个csv文件合并为一个文件

java - 如何测试数组是否包含 map 中的每个值?

regex - 访问 vba 替换/正则表达式?

java - 正则表达式替换替换字符串