【问题标题】:Java String formatting Regex PatternJava字符串格式化正则表达式模式
【发布时间】:2020-05-17 17:05:14
【问题描述】:

我是 Regex 和 Java 字符串格式化的新手,我想格式化这个字符串:

String text = "[(0 : 1 : 0), (2 : 11 : 1), (2 : 12 : 1)]";

数字是点坐标 x,y,z,我希望能够将括号内的值分配给对象 - 所以我需要隔离它们,然后只获取数字值。谁能帮助我用什么正则表达式可以帮助我实现这一目标?我列出了我的问题的一些规范。

  • 文本值中的点数会有很大差异 - 可以是 0 到 n。
  • 我希望能够遍历字符串以正确分配每个坐标 (x,y,z),因此我需要括号 () 来指示点的结束和开始,以及:指示坐标的结束和开始。

我正在寻找一种可以帮助我实现这一目标的模式 - 我查找了诸如格式、模式等之类的类以及诸如 replaceAll 之类的方法,但我真的坚持使用哪种模式能够以某种方式进行迭代它正确识别坐标 - 您可以看到坐标可以是两位数,因此它必须采用 : 之后的所有数字。

【问题讨论】:

  • 您想要一个正则表达式的任何特殊原因?
  • :0在第一个元组之间没有空格,还是冒号前后总是有空格?
  • 还不错。您需要一个匹配 (0 : 1 :0) 的正则表达式,其中每个数字是 1 到 8 位数字(带有可选的减号?)。你需要为数字捕获组——使用圆括号。然后你需要重复调​​用Matcher.find() 来匹配每个元组。对于找到的每个元组,取出捕获的组并使用Integer.parseInt() 将它们解析为int
  • @Ole V.V. - 很抱歉这是一个错字 - 前后总是有空格:njzk2 - 我只是认为它会为我完成这项工作 - 如果没有正则表达式,你有更好的解决方案吗?

标签: java regex string loops formatting


【解决方案1】:

检查这是否达到你想要的:

    String text = "[(0 : 1 :0), (2 : 11 : 1), (2 : 12 : 1)]";
    String patternString = "\\((\\d+)\\D+(\\d+)\\D+(\\d+)\\)";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(text);
    while(matcher.find()) {
      System.out.println(matcher.group(1) + " " + matcher.group(2) + " " + matcher.group(3));
    }

我不知道优雅,但对未来的一些解释。正则表达式最初看起来像这样:\((\d+)\D+(\d+)\D+(\d+)\) 因为它是 java 我们需要通过添加额外的斜杠来转义斜杠,所以所有单斜杠都变成了双斜杠。 ' \( ' 和 ' \)' 意味着找到一个括号。然后我们使用 (\d+) 找到至少一个数字并将其捕获以捕获组。 \D+ - 找到至少一个非数字。未来处理正则表达式的有用资源:regex101.com regexone.com tutorials.jenkov.com/java-regex/matcher.html

【讨论】:

  • 这正是我所需要的!!!感谢您提供如此快速的响应和优雅的解决方案!
  • 这是一个很好的开始。它似乎不满足只获取数字值,但也许 OP 可以处理。为了更好地验证,我会在数字之间使用\s+:\s+ 而不是\D+,但我承认这是自作多情。
  • 我不知道优雅,但对未来的一些解释。正则表达式最初看起来像这样:\((\d+)\D+(\d+)\D+(\d+)\) 因为它是 java 我们需要通过添加额外的斜杠来转义斜杠,所以所有单斜杠都变成了双斜杠。 ' ( ' 和 ' )' 的意思是找到一个括号。然后我们使用 (\d+) 找到至少一个数字并将其捕获以捕获组。 \D+ - 找到至少一个非数字。未来处理正则表达式的有用资源:regex101.comregexone.comtutorials.jenkov.com/java-regex/matcher.html 请接受答案。
  • 很好的解释,谢谢!评论并不总是在 Stack Overflow 上持续存在,也不是所有用户都阅读它们,所以未来的任何事情都应该成为答案本身。我把你很好的解释贴在那里了。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2017-05-10
  • 2015-07-03
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多