Ano*_*ror 6 java regex string performance split
第一次发帖.
首先我知道如何使用Pattern Matcher和String Split.我的问题最适合我在我的例子中使用,为什么?或建议更好的替代品.
任务:我需要在未知字符串中的两个已知正则表达式之间提取未知的NOUN.
我的解决方案:获取名词的开头和结尾(来自Regexp 1和2)和子串来提取名词.
String line = "unknownXoooXNOUNXccccccXunknown";
int goal = 12 ;
String regexp1 = "Xo+X";
String regexp2 = "Xc+X";
Run Code Online (Sandbox Code Playgroud)
A)我可以使用模式匹配器
Pattern p = Pattern.compile(regexp1);
Matcher m = p.matcher(line);
if (m.find()) {
int afterRegex1 = m.end();
} else {
throw new IllegalArgumentException();
//TODO Exception Management;
}
Run Code Online (Sandbox Code Playgroud)
B)我可以使用String Split
String[] split = line.split(regex1,2);
if (split.length != 2) {
throw new UnsupportedOperationException();
//TODO Exception Management;
}
int afterRegex1 = line.indexOf(split[1]);
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种方法?为什么?我不知道哪个在时间和记忆上更有效率.两者都足够接近我自己的可读性.
我这样做:
String line = "unknownXoooXNOUNXccccccXunknown";
String regex = "Xo+X(.*?)Xc+X";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(line);
if (m.find()) {
String noun = m.group(1);
}
Run Code Online (Sandbox Code Playgroud)
本(.*?)
是用来制造上的名词内匹配舍不得.这可以保护我们免受我们的结束模式再次出现在字符串的未知部分的情况.
编辑
这是有效的,因为它(.*?)
定义了一个捕获组.在模式中只定义了一个这样的组,因此它获得索引1(参数为m.group(1)
).这些组从1开始从左到右编制索引.如果模式定义如下
String regex = "(Xo+X)(.*?)(Xc+X)";
Run Code Online (Sandbox Code Playgroud)
然后会有三个捕获组,这样
m.group(1); // yields "XoooX"
m.group(2); // yields "NOUN"
m.group(3); // yields "XccccccX"
Run Code Online (Sandbox Code Playgroud)
这里是一组0,但整个模式匹配,它的等效于此
m.group(); // yields "XoooXNOUNXccccccX"
Run Code Online (Sandbox Code Playgroud)
有关可以对其执行的操作的更多信息Matcher
,包括在源字符串中获取模式的开始和结束位置的方法,请参阅Matcher JavaDocs