Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 使用regex解析数组语法_Java_Regex_Arrays_Text Parsing - Fatal编程技术网

Java 使用regex解析数组语法

Java 使用regex解析数组语法,java,regex,arrays,text-parsing,Java,Regex,Arrays,Text Parsing,我想我问的不是很琐碎,就是已经问过了,但我很难找到答案 我们需要捕获给定字符串中括号之间的内部数字字符 因此,考虑到字符串 StringWithMultiArrayAccess[0][9][4][45][1] 还有正则表达式 ^\w*?(\[(\d+)\])+? 我希望有6个捕获组和对内部数据的访问。 但是,我最终只捕获了捕获组2中的最后一个“1”角色 如果这很重要,下面是我的java junit测试: @Test public void ensureThatJsonHandlerCanHa

我想我问的不是很琐碎,就是已经问过了,但我很难找到答案

我们需要捕获给定字符串中括号之间的内部数字字符

因此,考虑到字符串

StringWithMultiArrayAccess[0][9][4][45][1]
还有正则表达式

^\w*?(\[(\d+)\])+?
我希望有6个捕获组和对内部数据的访问。 但是,我最终只捕获了捕获组2中的最后一个“1”角色

如果这很重要,下面是我的java junit测试:

@Test
public void ensureThatJsonHandlerCanHandleNestedArrays(){
    String stringWithArr = "StringWithMultiArray[0][0][4][45][1]";
    Pattern pattern = Pattern.compile("^\\w*?(\\[(\\d+)\\])+?");


    Matcher matcher = pattern.matcher(stringWithArr);
    matcher.find();

    assertTrue(matcher.matches()); //passes

    System.out.println(matcher.group(2));  //prints 1 (matched from last array symbols)

    assertEquals("0", matcher.group(2)); //expected but its 1 not zero
    assertEquals("45", matcher.group(5));  //only 2 capture groups exist, the whole string and the 1 from the last array brackets

}

为了捕获每个数字,您需要更改正则表达式,以便它(a)捕获单个数字,并且(b)不锚定到字符串的任何其他部分(因此不受任何其他部分的限制)(“^\w*?”将其锚定到字符串的开头)。然后,您可以在它们之间循环:

Matcher mtchr = Pattern.compile("\\[(\\d+)\\]").matcher(arrayAsStr);
while(mtchr.find())  {
   System.out.print(mtchr.group(1) + " ");
}
输出:

0 9 4 45 1

数字前的字符串真的很重要吗?当您重复一个捕获组时,只有最后一个捕获将保留在捕获组中。在我接受您的答案之前,这是正确的,并且确实有效。。。我想知道如何确保单词和第一个括号之间没有空格,最后一个括号和行尾之间没有空格。。。这并不重要。。。但会在我的场景中增加极端价值。顺便说一句,循环非常有价值。首先将行作为一个整体与“^\\w+(?:\\[(\\d+\\])+$”匹配。当发现这一点时(当“mtchr.matches()”为true时),按照我的答案运行上面的操作。