正则表达式修改

Regular expression revision

问题:给定一个二进制字母表{0,1},写一个识别所有单词的正则表达式 至少有两个连续的“1”,例如 0100110011100010011001.

我尝试的答案是:0*{ (0|1)* 11+ }*

您可以使用像

这样的简单表达式
[01]*11[01]*

regex demo

解释:

  • [01]* - 零个或多个零或一
  • 11 - 两个连续的 1s
  • [01]* - 零个或多个零或一

如果字母表是给定的,这样您就不必考虑任何不在该语言中的符号,并且您一次匹配一个单词,这样您就不必担心单词开头和结尾,很简单。

.*?11

我们勉强匹配所有内容,直到找到两个连续的 1。然后我们知道我们匹配的词是我们感兴趣的词。


但是,我觉得这不能回答您的问题。有些东西告诉我你正在使用一种非常受限的风格,不允许不情愿(尽可能少地与 *? 匹配),也不允许滥交(将 "whatever" 与 . 匹配)。

因此,将您的正则表达式想象成处于两种可能的状态。第一个是不满意的状态,我们没有匹配到连续的两个 1,第二个是满意的状态,我们 .

  1. 只要我们匹配 0,或者 1 后跟 0,我们就保持不满意状态。这是 (0|10)*.
  2. 然后匹配两个连续的1,达到满意状态。这是 11.
  3. 之后,我们可以同时匹配0和1,保持满意状态。这是(0|1)*。如果你的风格中有字符 类,你可以使用它们,如 [01]*.

把它们放在一起,我们得到

(0|10)*11(0|1)*

可以在 Regex 101.

上看到它的实际效果