java - 带有可选分隔符的正则表达式捕获组

标签 java regex regex-lookarounds capturing-group

这似乎是一个简单的问题,我需要提取一个捕获组并有选择地使用定界字符串限制该组。

在下面的示例中,我提供了一个分隔字符串“cd”,并期望它在所有情况下都会返回“ab”:“ab”、“abcd”和“abcdefg”

代码如下:

public static void main(String[] args) {
    String expected = "ab"; // Could be more or less than two characters
    String[] tests = {"ab", "abcd", "abcdefg"};
    Pattern pattern = Pattern.compile("(.*)cd?.*");

    for(String test : tests) {
        Matcher match = pattern.matcher(test);
        if(match.matches()) {
            if(expected.equals(match.group(1)))
                System.out.println("Capture Group for test: " + test + " - " + match.group(1));
            else System.err.println("Expected " + expected + " but captured " + match.group(1));
        } else System.err.println("No match for " + test);
    }
}

输出是:


    No match for ab
    Capture Group for test: abcd - ab
    Capture Group for test: abcdefg - ab

我认为前瞻可能有用,但我认为没有一个是可选的(即零个或多个实例)

最佳答案

试试这个:

Pattern pattern = Pattern.compile("(.*?)(?:cd.*|$)");

.*? 是非贪婪的,正则表达式的其余部分要么匹配 cd 后跟任何内容,要么匹配字符串的结尾。

关于java - 带有可选分隔符的正则表达式捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5494845/

相关文章:

java - 找出我的线程落在 ReentrantLock 中的什么位置

java - onClickListener 事件未在 TableLayout 和动态 n 行上触发

javascript - 返回javascript中正则表达式的每个匹配中第一个捕获的组?

python - 匹配正则表达式中的连续数字,同时忽略 python3 中的破折号

c# - 负前瞻行为不符合预期

正则表达式:如何删除每行冒号之前的所有内容

java - 如何避免耦合两个现在具有相似实现但将来可能会发生变化的方法?

java - 如何动态更改 JSplitPane 中的组件

java - Java 上的正则表达式 : avoiding unnecessary "greedy" strategy by Matcher class

javascript - 使用正则表达式提取 JavaScript 中给定模式的字符串