Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串格式化正则表达式模式_Java_Regex_String_Loops_Formatting - Fatal编程技术网

Java字符串格式化正则表达式模式

Java字符串格式化正则表达式模式,java,regex,string,loops,formatting,Java,Regex,String,Loops,Formatting,我不熟悉正则表达式和Java字符串格式,我想格式化此字符串: String text = "[(0 : 1 : 0), (2 : 11 : 1), (2 : 12 : 1)]"; 这些数字是点坐标x、y、z,我希望能够将括号内的值指定给对象-因此我需要将它们隔离,然后只获取数字值。有人能帮我做些什么regex能帮我做到这一点吗?我列出了我的问题的一些规范 文本值中的点数变化很大-可以是0到n 我希望能够遍历字符串以正确分配每个坐标(x,y,z),因此我需要括号()表示点的结束和开始,括号:表

我不熟悉正则表达式和Java字符串格式,我想格式化此字符串:

String text = "[(0 : 1 : 0), (2 : 11 : 1), (2 : 12 : 1)]";
这些数字是点坐标x、y、z,我希望能够将括号内的值指定给对象-因此我需要将它们隔离,然后只获取数字值。有人能帮我做些什么regex能帮我做到这一点吗?我列出了我的问题的一些规范

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

我正在寻找一种模式来帮助我实现这一点-我查找了像format、pattern、,等等,还有像replaceAll这样的方法,但我真的被困在了使用什么模式才能以正确识别坐标的方式进行迭代的问题上——你可以看到坐标可以是两位数,所以它必须包含以下所有数字:。

检查这是否实现了你想要的:

    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));
    }

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

您需要正则表达式的具体原因是什么?是第一个元组之间没有空格,还是冒号前后总是有空格?这还不错。您需要一个与
(0:1:0)
匹配的正则表达式,其中每个数字都是,比如说,1到8位(带可选减号?)。你需要捕捉数字的分组-使用圆括号。然后需要反复调用
Matcher.find()
来匹配每个元组。对于找到的每个元组,取出捕获的组,并使用
Integer.parseInt()
@Ole V.V.将它们解析为
int
。-很抱歉,这是一个输入错误-前后总是有空格:njzk2-我只是认为它可以帮我完成工作-没有regex,你有更好的解决方案吗?这正是我需要的!!!感谢您如此快速的响应和优雅的解决方案!!这是一个很好的开始。它似乎不满足于只获取数字值,但也许OP可以处理这个问题。为了更好地验证,我会在数字之间使用
\s+:\s+
而不是
\d+
,但我承认这是自欺欺人的。我不知道优雅,但对未来有一些解释。Regexp最初看起来是这样的:
\(\d+)\d+(\d+)\d+(\d+)
因为它是java,我们需要通过添加额外的斜杠来避开斜杠,所以所有的单斜杠都变成了双斜杠。”('and')的意思是找到一个括号。然后,我们使用(\d+)查找至少一个数字并捕获它以捕获组\D+-至少查找一个非数字。未来处理regexp的有用资源:请接受答案。很好的解释,谢谢!评论在堆栈溢出时并不总是持久的,而且也不是所有用户都会阅读它们,因此将来的任何事情都应该进入答案本身。我把你的解释贴在那里。