Parsing array syntax using regex

穿精又带淫゛_ 提交于 2019-12-08 09:06:54

问题


I think what I am asking is either very trivial or already asked, but I have had a hard time finding answers.

We need to capture the inner number characters between brackets within a given string.

so given the string

StringWithMultiArrayAccess[0][9][4][45][1]

and the regex

^\w*?(\[(\d+)\])+?

I would expect 6 capture groups and access to the inner data. However, I end up only capturing the last "1" character in capture group 2.

If it is important heres my java junit test:

@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

}

回答1:


In order to capture each number, you need to change your regex so it (a) captures a single number and (b) is not anchored to--and therefore limited by--any other part of the string ("^\w*?" anchors it to the start of the string). Then you can loop through them:

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

Output:

0 9 4 45 1


来源:https://stackoverflow.com/questions/22730661/parsing-array-syntax-using-regex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!