Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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
Java 如何获得模式的“不匹配”:regex后面不跟另一个regex_Java_Regex_Regex Negation_Lookahead_Negative Lookahead - Fatal编程技术网

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。请注意转义的
|