在java中使用Regex获取特定的String列表

时间:2013-09-04 23:33:16

标签: java regex parsing

我的字符串将如下所示,

lopsakf pkpsdkf pskadp fkpsdkfp sdaf
oksflksflslkf sdlf kasldfk lasdkf lsadfk 
lopsakf pkpsdkf pskadp fkpsdkfp sdaf
oksflksflslkf sdlf kasldfk lasdkf lsadfk lopsakf pkpsdkf pskadp fkpsdkfp sdaf
oksflksflslkf sdlf kasldfk lasdkf lsadfk 

[[test: lls]]
[[test: askd]]
[[test: mmdm]]
[[test: owow]]
[[test: www]]
[[test: wowow]]

我想获取值lls,askd,mmdm等,并将其存储在List中。请注意,这些文本数量巨大。我需要一种有效的方法来解析每个集合并将其存储在List中,而不使用任何外部库。

3 个答案:

答案 0 :(得分:1)

\[\[test:\s([\w]+)\]\]

Regular expression visualization

Edit live on Debuggex

它基本上捕获捕获组中的[[test: *any number and character here* ]],它通常以数组形式返回。

Info About Capture Groups

注意:您可能需要转义字符(I.E. \\ [)

答案 1 :(得分:1)

您可以尝试使用正则表达式:

(?<=\[\[test: )[^]]+

另一方面,你需要使用常量java.util.regex.Pattern来避免每次重新编译表达式,如下所示:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("(?<=\\[\\[test: )[^]]+");

public static void main(String[] args) {
    String input = "lopsakf pkpsdkf pskadp fkpsdkfp sdaf\noksflksflslkf sdlf kasldfk lasdkf lsadfk \nlopsakf pkpsdkf pskadp fkpsdkfp sdaf\noksflksflslkf sdlf kasldfk lasdkf lsadfk lopsakf pkpsdkf pskadp fkpsdkfp sdaf\noksflksflslkf sdlf kasldfk lasdkf lsadfk \n\n[[test: lls]]\n[[test: askd]]\n[[test: mmdm]]\n[[test: owow]]\n[[test: www]]\n[[test: wowow]]";

    Matcher matcher = REGEX_PATTERN.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

输出:

lls
askd
mmdm
owow
www
wowow

使用matcher.find()matcher.group()获取所需的字符串。

另一种方法是,根据可能存在的字符串数量,使用已定义初始容量的java.util.ArrayList实例,以便不需要列表将元素复制到新的内部数组。

答案 2 :(得分:0)

如下所示使用Matcher提取每个字符串并将其添加到列表应该可以正常工作(正则表达式未经测试):

String input = "My input string....";

List<String> myStrings = new ArrayList<String>();
String pattern = "\\[\\[test: (\\w+)\\]\\]";
Matcher matcher = Pattern.compile(pattern).matcher(input);
while (matcher.find())
{
    String matchedString = matcher.group(1);
    myStrings.add(matchedString);
}

如果您想避免重复的字符串,也可以添加到Set而不是List

就效率而言,您可以编写一个更有效的解决方案,逐个字符地解析字符串并避免正则表达式开销,但这些收益可能不值得这样做。