Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
Regex 如何使用正则表达式检查每个四个零的子串后面是否至少有四个一?_Regex - Fatal编程技术网

Regex 如何使用正则表达式检查每个四个零的子串后面是否至少有四个一?

Regex 如何使用正则表达式检查每个四个零的子串后面是否至少有四个一?,regex,Regex,如何编写正则表达式 当有0000时,后面应该有1111,例如: 00101011000011111111001111010 -> correct 0000110 -> incorect 11110 -> correct 感谢您的帮助如果您正在使用Perl,您可以使用: 如果一个0000字符串后面至少没有四个1s,则模式匹配。因此,匹配表示字符串不正确 输出: C:\Temp> s 00

如何编写正则表达式 当有0000时,后面应该有1111,例如:

00101011000011111111001111010 -> correct
0000110                       -> incorect
11110                         -> correct

感谢您的帮助

如果您正在使用Perl,您可以使用:

如果一个
0000
字符串后面至少没有四个
1
s,则模式匹配。因此,匹配表示字符串不正确

输出:

C:\Temp> s 00101011000011111111001111010 -> correct 00001111000011 -> incorrect 0000110 -> incorrect 11110 -> correct C:\Temp>s 00101011000011111111001111010->正确 000011110011->不正确 0000110->不正确
11110->correct虽然一些语言所谓的“正则表达式”实际上实现了与计算机科学中所谓的正则表达式完全不同的东西(通常是一个超集)(包括下推自动机,甚至是“正则表达式”中的任意代码执行),但我认为,用实际的正则表达式来回答,最佳做法如下:

isValid := (/^(?!.*violationPattern)/ FOUND ON s)
一般来说,正则表达式是回答“文本中有没有出现以下模式的地方”这类问题的好方法(当然,由于模式的限制——例如,嵌套括号的平衡超出了正则表达式的能力,尽管它当然可能不超出正则表达式任意超集的能力)。“整个文本是否匹配此模式”显然是“文本中的任何点是否匹配此模式”问题的特例,考虑到可能有特殊标记,表示“文本的开始”和“文本的结束”(典型的正则表达式模式语法中通常是
^
$

然而,问题“你能检查文本中没有与此模式匹配的点”并不是正则表达式匹配可以直接回答的答案……但是,添加(在正则表达式之外)逻辑运算
not
显然在实践中解决了问题,因为“检查没有匹配的点”显然是相同的“告诉我是否有任何点匹配”,然后是“将成功转化为失败,反之亦然”(后者是
逻辑部分,而不是
部分)。这是中的关键洞察,超出了Perl消极前瞻的具体用途(这实际上只是一种快捷方式,而不是regex power本身的扩展)

如果您最喜欢的在中使用正则表达式的语言没有负前瞻性,但有
{}
“计数快捷方式”、括号和竖线“或”操作:

00001{0,3}([^1]|$)

i、 例如,“四个0后跟零到三个1,后跟一个非1字符或文本结尾”正是这样一种模式,即如果文本在任何地方匹配它,就会违反您的约束(注意,它可以被视为对负先行快捷语法的轻微扩展),您就在这里!

这里有几种方法,我将列出其中的一些

检查所有情况下是否始终满足要求 在这种方法中,我们只需查找
0000(1111)?
并查找所有匹配项。由于
是贪婪的,如果可能,它将匹配
1111
,因此我们只需检查每个匹配项是否为
00001111
。如果仅为
0000
,则我们说输入无效。如果未找到任何仅为
0000
的匹配项(可能是因为一开始根本没有匹配),那么我们就说它是有效的

在伪代码中:

FUNCTION isValid(s:String) : boolean
   FOR EVERY match /0000(1111)?/ FOUND ON s
      IF match IS NOT "00001111" THEN
         RETURN false

   RETURN true

检查是否存在不符合要求的情况(然后反对) 在这种方法中,我们使用正则表达式来尝试查找冲突,因此,成功匹配意味着我们说输入无效。如果没有匹配,那么就没有冲突,因此我们说输入有效(这就是“检查然后反对”的意思)

伪码

isValid := NOT (/violationPattern/ FOUND ON s)
前瞻选项 如果你的口味支持它,那么负前瞻是表达这种模式的最自然的方式。只需查找
0000(?!1111)

无前瞻选项 如果您的风格不支持负前瞻,您仍然可以使用这种方法。现在模式变成
00001{0,3}(0 |$)
。也就是说,我们尝试匹配
0000
,然后是
1{0,3}
(即介于0-3
1
),然后是
0
或字符串结束锚定符
$

详细说明的选项 这相当于前面的选项,但是您没有使用重复和交替语法,而是显式地说明违规行为是什么

00000|000010|0000110|00001110|
0000$|00001$|000011$|0000111$

检查是否存在不符合要求的情况 这依赖于消极前瞻;它只是将先前的方法带入下一个层次。而不是:

isValid := NOT (/violationPattern/ FOUND ON s)
我们可以使用负前瞻将
NOT
引入正则表达式,如下所示:

isValid := (/^(?!.*violationPattern)/ FOUND ON s)
也就是说,将我们自己锚定在字符串的开头,我们消极地断言我们可以匹配
*violationPattern
*
允许我们在必要的时候“搜索”
violationPattern


附件 以下是rubular上显示的模式:

  • 方法1:仅匹配
    0000
    表示无效
  • 方法2:匹配意味着无效
  • 方法3:匹配意味着有效
使用的输入是(注释以显示哪些输入有效):

工具书类

您能指定哪种语言吗?所有语言都有不同的正则表达式语法。您能编辑示例以更清楚地说明哪些是正确的,哪些不是。据我所知(这可能会使正则表达式复杂化):
00001111001
应该是无效的,因为不是每个
0000
的实例后面都跟着
1111
@Johannes更新了我的答案。是的,
00001111001
被标记为不正确。啊,对不起。现在我明白了。通过否定匹配条件,你为自己省去了很多痛苦。很好。我正在拼命尝试我的答案拥有
+ 00101011000011111111001111010
- 000011110000
- 0000110
+ 11110
- 00000
- 00001
- 000011
- 0000111
+ 00001111