Answers:
使用否定环顾: (?!
pattern
)
正面环视可用于断言模式匹配。负面的反面是相反的:它用于断言模式不匹配。有些味道支持断言。有些限制了后视等等。
这些都是为玩具问题练习提供正则表达式解决方案的尝试。如果您试图学习各种使用环视的方法(嵌套,使用它们进行捕捉等),则它们应该具有教育意义:
Pattern.compile("(?!(a.*b))").matcher("xab").matches()
应该是true
吧?
假设您只想禁止与正则表达式完全匹配的字符串(即mmbla
可以,但mm
不能),这就是您想要的:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
是负面的前瞻 ; 它说:“从当前位置开始,接下来的几个字符不是 mm
或t
,然后是字符串的结尾。” 开头的起始锚(^
)确保在字符串的开头应用前瞻。如果成功,.*
则继续并使用该字符串。
仅供参考,如果您使用Java的matches()
方法,则实际上并不需要the ^
和final $
,但它们不会造成任何危害。但是,$
内部必须是先行的。
.*
在正则表达式的末尾添加,否则它将拒绝每个字符串。
$
内部负先行,并.*
在年底都是关键位。与RE一样,强大的单元测试集对于正确完成它绝对至关重要。这个答案是100%正确的。
{1}
是完全没有用的。(如果您确实认为它提供了一些价值,那么为什么不写((m{1}a{1}){1}|(t){1}){1}
?)