我的字符串将如下所示,
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中,而不使用任何外部库。
答案 0 :(得分:1)
\[\[test:\s([\w]+)\]\]
它基本上捕获捕获组中的[[test: *any number and character here* ]]
,它通常以数组形式返回。
注意:您可能需要转义字符(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
。
就效率而言,您可以编写一个更有效的解决方案,逐个字符地解析字符串并避免正则表达式开销,但这些收益可能不值得这样做。