使用正则表达式提取由另一个子字符串分隔的子字符串

时间:2016-06-23 07:13:15

标签: regex delimiter

我试图使用正则表达式来捕获由另一个子字符串分隔的子字符串。例如,如果我有句子

  

我的猫是一只猫。

我要使用的分隔符是" cat",输出应为

  

我的

     

     

我找不到解决方案,其中分隔符不是单个字符。

编辑:我用Java写这个,输出代表Java' myMatcher.group()"等调用中由Java的Matcher类返回的组。对不起,感到困惑。

1 个答案:

答案 0 :(得分:0)

Tushar在评论中指出,你所需要的是String#split

String s = "My cat is a cat.";
String[] res = s.split("cat");
System.out.println(Arrays.toString(res));

这是唯一正确的方法。

现在,您想知道如何将除cat以外的任何文字与Matcher匹配。

免责声明:不要在Java中使用它,因为它非常不切实际且不具有性能。

您可以匹配cat并将其捕获到一个组中,并为该模式添加另一种替代方案,以匹配cat以外的任何文字。

String s = "My cat is a cat.";
Pattern pattern = Pattern.compile("(?i)(cat)|[^c]*(?:c(?!at)[^c]*)*");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    if (matcher.group(1) == null) {      // Did we match "cat"?
        if (!matcher.group(0).isEmpty()) //  Is the match text NOT empty?  System.out.println(matcher.group(0));        //    Great, print it
    }
} 

请参阅IDEONE demo

模式详情

  • (?i) - 不区分大小写的内联修饰符
  • (cat) - 第1组捕获子字符串cat
  • | - 或
  • [^c]*(?:c(?!at)[^c]*)* - 不是cat子字符串起点的子字符串。它是展开的(?s)(?:(?!cat).)* tempered greedy token
    • [^c]* - 除cC
    • 以外的0个字符
    • (?:c(?!at)[^c]*)* - 零个或多个序列:
    • c(?!at) - cC未跟随atAtATaT
    • [^c]* - 除cC
    • 以外的0个字符