Java正则表达式:在二进制字符串中对连续的1或0进行分组

Java正则表达式:在二进制字符串中对连续的1或0进行分组,java,regex,Java,Regex,我想捕获二进制字符串中的所有连续组 1000011100001100111100001 应该给我 1 0000 111 0000 11 00 1111 0000 1 我在java应用程序中使用了([1?| 0?]+)regex,将字符串中的相应1或0分组,如1000011000011。 但当我在代码中运行它时,控制台中没有打印任何内容: String name ="10000111000011"; regex("(\\[1?|0?]+)" ,name); public st

我想捕获二进制字符串中的所有连续组

1000011100001100111100001
应该给我

1
0000
111
0000
11
00
1111
0000
1
我在java应用程序中使用了
([1?| 0?]+)
regex,将字符串中的相应1或0分组,如
1000011000011
。 但当我在代码中运行它时,控制台中没有打印任何内容:

String name ="10000111000011";
    regex("(\\[1?|0?]+)" ,name);

    public static void regex(String regex, String searchedString) {

        Pattern pattern = Pattern.compile(regex);
        Matcher regexMatcher = pattern.matcher(searchedString);
        while (regexMatcher.find()) 
            if (regexMatcher.group().length() > 0)
                System.out.println(regexMatcher.group());
    }
为了避免正则表达式运行时出现语法错误,我将
([1?| 0?]+)
更改为
(\\[1?| 0?]+)

为什么没有基于正则表达式的组?您可以尝试以下方法:

(1+|0+)

示例代码:

    final String regex = "(1+|0+)";
    final String string = "10000111000011\n"
            + "11001111110011";

    final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE);
    final Matcher matcher = pattern.matcher(string);

    while (matcher.find()) {

                System.out.println("Group " + 1 + ": " + matcher.group(1));


    }

首先,作为一种解释,正则表达式定义了一个字符类(
[
..
]
),它与任何字符
1
|
0
匹配一次或多次(
+
)。我想你的意思是在它里面有
,除此之外,这将使
成为一个与
0
1
匹配的替代。但那也不是你想要的(我想;)

现在,解决方案可能是:

([01])\1*
它匹配
0
1
,并捕获它。然后,它会多次匹配相同数字的任何数字(
\1
是第一个捕获组中捕获的内容的反向引用-在本例中是
0
1


.

您的正则表达式也不会打印任何内容(\[01])\1请检查添加的示例。添加了解释以回答问题。@Quota Correct,它捕获第一个数字。但是如果您检查OP的示例,则使用完全匹配-
regexMatcher.group()
(没有任何数字作为
group
的参数提供完全匹配)。@Quota这可能是真的-可能更容易理解。在这种情况下,您甚至可以通过删除捕获组-
0+| 1+
来进一步简化它,这使得它(更)高效。不过,我给出的一个可以很容易地为其他应用程序修改(例如字母的匹配范围
(\w)\1*
)。但这不在范围之内,所以…请解释一下你为什么否决这个问题?我编辑了我的问题,我知道。它只考虑一个群体。但你不应该因此而否决我:(下次请从一开始就提供示例输入和输出:)是的,当然。我只是想,测试站点接受了它,但我没有注意到它只接受了一个组