0

我的字符串看起来像这样,

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 等值并将其存储在列表中。请注意,此类文本数量巨大。我需要一种有效的方法来解析每个集合并将其存储在列表中,而不使用任何外部库。

4

3 回答 3

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

正则表达式可视化

在 Debuggex 上实时编辑

它本质上是[[test: *any number and character here* ]]在一个捕获组中捕获,该捕获组通常作为一个数组返回。

关于捕获组的信息

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

于 2013-09-04T23:38:09.213 回答
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()andmatcher.group()获取所需的字符串。

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

于 2013-09-04T23:51:18.293 回答
0

像下面这样使用 aMatcher来提取每个字符串并将其添加到列表中应该可以工作(正则表达式未经测试):

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

如果要避免重复字符串,也可以添加到 aSet而不是 a 。List

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

于 2013-09-04T23:48:31.997 回答