我试图使用正则表达式来捕获由另一个子字符串分隔的子字符串。例如,如果我有句子
我的猫是一只猫。
我要使用的分隔符是" cat",输出应为
我的
是
我找不到解决方案,其中分隔符不是单个字符。
编辑:我用Java写这个,输出代表Java' myMatcher.group()"等调用中由Java的Matcher类返回的组。对不起,感到困惑。
答案 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]*
- 除c
或C
(?:c(?!at)[^c]*)*
- 零个或多个序列:c(?!at)
- c
或C
未跟随at
,At
,AT
,aT
[^c]*
- 除c
或C