从实际应用上看,这不是一个适合用正则表达式解决的问题。再强调一遍:
**这不是一个适合用正则表达式解决的问题**。
但是如果非要用正则解决,不失为一个有趣的练习。
1. 首先要指出的是题主给出的答案是错误,很容易验证:
https://regexr.com/669d12. 所谓的『认知差距』可能主要是对数学思想的熟悉和熟练程度。具体到这个问题上,关键思想无非是把一个复杂的未知问题转化为一个或多个简单的已知问题。下面我来尝试一下:
题目要求是判断一个字符串『是否仅由偶数个 0 和奇数个 1 组成,不论顺序。』(不论顺序后略)
该条件等价于『由偶数个 0 和任意数量的 1 组成』 且
『由奇数个 1 和任意数量的 0 组成』。
由此可以将原问题转化为三个子问题:
1. 如何判断一个字符串是否『由偶数个 0 和任意数量的 1 组成』
2. 如何判断一个字符串是否『由奇数个 1 和任意数量的 0 组成』
3. 如何判断一个字符串同时满足 1. 和 2.
首先解决问题 1:如何判断一个字符串是否『由偶数个 0 和任意数量的 1 组成』,这部分很简单,根据偶数的定义可以再次转化为『任意多个 1,加上由两个 0 和任意数量的 1 组成的小节重复任意多次』,写出如下正则表达式:
```
^1*(01*01*)*$
```
问题 1 解决之后再来看问题 2 『由奇数个 1 和任意数量的 0 组成』就会发现它等价于『至少包含一个 1,且去掉第一个 1 剩下的部分由偶数个 1 和任意数量的 0 组成』,后半段子命题完全同构于问题 1,唯一的区别是 0 和 1 在子命题里被互换了。不做赘述,正则表达式如下:
```
^0*10*(10*10*)*$
```
最后是问题 3:如何判断一个字符串同时匹配两个正则表达式,而且这两个正则都是精确匹配。这个问题没有什么技巧可言,熟悉正则表达式的断言的话的话可以轻松写出同时满足 `EXPRESSION_A` 和 `EXPRESSION_B` 的表达式:
```
(?=^<EXPRESSION_A>$)^<EXPRESSION_B>$
```
综合上述三个问题及其解答,可以得出最终满足题意的表达式:
```
(?=^(1*01*01*)*$)(?=^0*1(0*10*10*)*$)
```
可以自行验证:
https://egexr.com/669bq