我有一个正则表达式,例如 (ma|(t){1}) . 它匹配 ma 和 t 并且与 bla 不匹配 .
(ma|(t){1})
ma
t
bla
我想否定正则表达式,因此它必须匹配 bla 而不是 ma 和 t , by adding something to this regex . 我知道我可以写 bla ,但实际的正则表达式更复杂 .
使用否定的外观: (?! pattern )
(?!
pattern
)
正面外观可用于断言模式匹配 . 否定的外观恰恰相反:它用于断言模式不匹配 . 一些风味支持断言;一些人对外观等有所限制 .
Lookahead and Lookbehind Zero-Width Assertions
Flavor comparison
How do I convert CamelCase into human-readable names in Java?
Regex for all strings not containing a string?
A regex to match a substring that isn’t followed by a certain other substring.
这些尝试是为玩具问题提出正则表达式解决方案作为练习;如果你正在尝试学习各种使用外观的方法(嵌套它们,使用它们来捕获等),它们应该具有教育意义:
codingBat plusOut using regex
codingBat repeatEnd using regex
codingbat wordEnds using regex
假设您只想完全禁止与正则表达式匹配的字符串(即 mmbla 没问题,但 mm 不是),这就是您想要的:
mmbla
mm
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$) 是否定lookahead;它说“从当前位置开始,接下来的几个字符不是 mm 或 t ,后面是字符串的结尾 . ”开头的锚点( ^ )确保在字符串的开头应用前瞻 . 如果成功,则 .* 继续并消耗字符串 .
(?!(?:m{2}|t)$)
^
.*
仅供参考,如果你使用're using Java'方法,你真的不需要 ^ 和最终 $ ,但它们不会造成任何伤害 . 但是,前瞻中的 $ 是必需的 .
$
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
这是给定的正则表达式 .\ b是找到单词边界 .前面的积极向前(?= \ w)就是为了避免空间 .对原始正则表达式的负面看法是为了防止它的匹配 .最后(\ w *)将捕获剩下的所有单词 .持有这些词的小组是第3组 .简单的(?!模式)将不起作用,因为任何子字符串都匹配简单的^(?!(?:m {2} | t)$) . * $将不起作用,因为它的粒度是实线
3 回答
使用否定的外观:
(?!
pattern
)
正面外观可用于断言模式匹配 . 否定的外观恰恰相反:它用于断言模式不匹配 . 一些风味支持断言;一些人对外观等有所限制 .
指向regular-expressions.info的链接
Lookahead and Lookbehind Zero-Width Assertions
Flavor comparison
另见
How do I convert CamelCase into human-readable names in Java?
Regex for all strings not containing a string?
A regex to match a substring that isn’t followed by a certain other substring.
更多例子
这些尝试是为玩具问题提出正则表达式解决方案作为练习;如果你正在尝试学习各种使用外观的方法(嵌套它们,使用它们来捕获等),它们应该具有教育意义:
codingBat plusOut using regex
codingBat repeatEnd using regex
codingbat wordEnds using regex
假设您只想完全禁止与正则表达式匹配的字符串(即
mmbla
没问题,但mm
不是),这就是您想要的:(?!(?:m{2}|t)$)
是否定lookahead;它说“从当前位置开始,接下来的几个字符不是mm
或t
,后面是字符串的结尾 . ”开头的锚点(^
)确保在字符串的开头应用前瞻 . 如果成功,则.*
继续并消耗字符串 .仅供参考,如果你使用're using Java'方法,你真的不需要
^
和最终$
,但它们不会造成任何伤害 . 但是,前瞻中的$
是必需的 .这是给定的正则表达式 .
\ b是找到单词边界 .
前面的积极向前(?= \ w)就是为了避免空间 .
对原始正则表达式的负面看法是为了防止它的匹配 .
最后(\ w *)将捕获剩下的所有单词 .
持有这些词的小组是第3组 .
简单的(?!模式)将不起作用,因为任何子字符串都匹配
简单的^(?!(?:m {2} | t)$) . * $将不起作用,因为它的粒度是实线