Java 如何获得模式的“不匹配”:regex后面不跟另一个regex
这显然是一个简化的情况,但需要的是一个正则表达式,它不能与Java 如何获得模式的“不匹配”:regex后面不跟另一个regex,java,regex,regex-negation,lookahead,negative-lookahead,Java,Regex,Regex Negation,Lookahead,Negative Lookahead,这显然是一个简化的情况,但需要的是一个正则表达式,它不能与aabb | bbaa匹配,但可以很好地用于aabb(后面不是|…) 类似正则表达式的[ab]+(?!\[ab]+)*非常接近,但它仍然匹配aabb中的aabb,而我希望在这种情况下根本不匹配 不允许使用字符串开头(^)和字符串结尾($)锚点。没有规则规定必须在单个正则表达式中表示所有内容。它还使代码不可读。我会建议像这样的东西 not (matches "aabb\|bbaa") and (matches "aabb") 如果你坚持,
aabb | bbaa
匹配,但可以很好地用于aabb
(后面不是|…
)
类似正则表达式的[ab]+(?!\[ab]+)*
非常接近,但它仍然匹配aabb
中的aabb
,而我希望在这种情况下根本不匹配
不允许使用字符串开头(
^
)和字符串结尾($
)锚点。没有规则规定必须在单个正则表达式中表示所有内容。它还使代码不可读。我会建议像这样的东西
not (matches "aabb\|bbaa") and (matches "aabb")
如果你坚持,你可以使用
([ab]+)(\|[ab]+)*
如果第二组不是空的,则放弃匹配。实际上,在前瞻中,不管怎样,都需要锚定
[ab]+(?=[^ab]*\z)
一般来说,如果a
和b
是任意的子表达式,则需要:
(?:a|b)+(?=(?s:(?!a)(?!b).)*\z)
应始终以/x
模式编写,以确保易读性和可维护性:
(?x)#启用空白和注释
(?:a#任何a
|b#或b
)+#重复一次或多次,优先选择更多
#现在是一个前瞻性断言
(?=
(s:(?!a)#现在还没有
(?!b)#也不是b在这一点上
.#任何单个代码点
)*#重复零次或多次
\z#固定在绳子的末端
)
听起来您使用了错误的Matcher
方法。使用Matcher#matches()
匹配整个输入序列。我使用Matcher#find(),然后使用找到的第一个组作为结果。我无法更改。您无法更改所使用的方法,也无法添加^$
锚定?这些看似武断的限制是什么?这是一个面试问题吗?更糟糕的是,这是一个遗留代码:)我只允许更改正则表达式。引用它的代码使用Matcher#find()和组来查找匹配的文本。请告诉建立这些规则的人他们是一群白痴。不过,如果这就像你有一个配置文件或类似的配置文件,使用拒绝和允许规则,那么首先使用拒绝a\| b
,然后使用允许a
。如果你只有允许规则,你就完蛋了。这里只有一种模式。我将其简化为[ab]+
,但如果称为p
,问题是:如何使Matcher#find()对p\\124; p
返回false,而对p
返回true。请注意转义的|
。