【问题标题】:Use regex to extract substrings delimited by another substring使用正则表达式提取由另一个子字符串分隔的子字符串
【发布时间】:2016-06-23 07:13:14
【问题描述】:

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

我的猫是猫。

我想使用的分隔符是“cat”,输出应该是

我的

是一个

.

我一直找不到分隔符不是单个字符的解决方案。

编辑:我是用 Java 编写的,输出代表 Java 的 Matcher 类在“myMatcher.group()”之类的调用中返回的组。很抱歉造成混乱。

【问题讨论】:

  • 您一直在哪里搜索,搜索关键字是什么?我的意思是:语言?工具?你试过什么?
  • Tushar 的方法works like this.
  • @WiktorStribiżew 我正在用 Java 写这个,我不清楚输出。我的意思是,如果有人使用 Java Matcher 类(即 myMatcher.group() ),那么每一行都应该是一个组。
  • @Grandfather-Paradox:如果您需要拆分一个字符串,为什么还要使用 Matcher?抱歉,您的问题太不清楚了。
  • 请添加您的代码。

标签: regex delimiter


【解决方案1】:

您需要的是 String#split,正如 Tushar 在评论中指出的那样。

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 后面没有 at, At, AT, aT
    • [^c]* - 除cC 之外的0+ 个字符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多