使用正则表达式解析数组语法 [英] Parsing array syntax using regex
问题描述
我认为我要问的是非常琐碎的或已经问过的,但是我很难找到答案。
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.
给定字符串
StringWithMultiArrayAccess[0][9][4][45][1]
和正则表达式
^\w*?(\[(\d+)\])+?
我希望有6个捕获组并可以访问内部数据。
但是,我最终只能捕获捕获组2中的最后一个 1字符。
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.
如果重要的是我的java junit测试,
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
}
推荐答案
为了捕获每个数字,您需要更改正则表达式,以便它(a)捕获单个数字,并且(b)不锚定于-并且因此受字符串的任何其他部分限制( ^ \w *?将其锚定到字符串的开头)。然后,您可以遍历它们:
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) + " ");
}
输出:
0 9 4 45 1
这篇关于使用正则表达式解析数组语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!