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