Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有可选分隔符的正则表达式捕获组_Java_Regex_Lookahead_Capturing Group - Fatal编程技术网

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

Java 带有可选分隔符的正则表达式捕获组,java,regex,lookahead,capturing-group,Java,Regex,Lookahead,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"

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

在下面的示例中,我提供了一个定界字符串'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

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

我认为您唯一的问题可能是
仅适用于
d
。试试
(cd)

我想你唯一的问题可能是
只适用于
d
。试试
(cd)

试试这个:

Pattern pattern = Pattern.compile("(.*?)(?:cd.*|$)");
*?
是非贪婪的,正则表达式的其余部分要么匹配
cd
,后跟任何内容,要么匹配字符串的结尾。

尝试以下操作:

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

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

输出:对于
abcd
abcdefg
输出失败:对于
abcd
abcdefg
来说失败,问题是,即使您做出了第一个
(.*)
非冻结,regex-
(?:cd)
*
中的所有其他内容都是可选的,因此捕获组将使用整个字符串,并且将有一个匹配项。您需要使正则表达式更加具体。此外,您可以使用,而不是为每个测试运行Java程序。考虑到需求,我不确定如何使正则表达式更具体。。。所需字符串的长度可以是一个或多个字符,否则长度限制器将起作用,但除此之外,我不知道如何对其进行限制。是否不能仅使用
索引of
子字符串
?您明白我的观点吗?从正则表达式的角度来看,无法区分要匹配的部分、可选分隔符和字符串的其余部分。@Melv-这是一个较大的组匹配器的一部分,因此
索引和
子字符串
不是选项问题是,即使您将第一个
(.*)
非冻结,regex-
(?:cd)
*
中的所有其他内容都是可选的,因此捕获组将使用整个字符串,并且将有一个匹配项。您需要使正则表达式更加具体。此外,您可以使用,而不是为每个测试运行Java程序。考虑到需求,我不确定如何使正则表达式更具体。。。所需字符串的长度可以是一个或多个字符,否则长度限制器将起作用,但除此之外,我不知道如何对其进行限制。是否不能仅使用
索引of
子字符串
?您明白我的观点吗?从正则表达式的角度来看,无法区分要匹配的部分、可选分隔符和字符串的其余部分。@Melv-这是较大组匹配器的一部分,因此
indexOf
子字符串
不是选项