Pattern Matcher Vs String Split,我应该使用哪个?

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)
  1. 我需要在第一个正则表达式之后找到索引位置.
  2. 我需要在第二个正则表达式之前找到索引位置.

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)

我应该使用哪种方法?为什么?我不知道哪个在时间和记忆上更有效率.两者都足够接近我自己的可读性.

Ian*_*ird 5

我这样做:

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

  • 值得注意的是,如果字符串中没有其他Xc + X实例,则只能正确捕获NOUN.如果字符串恰好是"unknownXoooXNOUNXccccccXunknownXcX",那么你将捕获"NOUNXccccccXunknown".我只提到这个,因为字符串是"未知的" - 所以它可能会发生.将正则表达式更新为"Xo + X(.*?)Xc + X"应该可以解决此问题. (2认同)