Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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中否定任何正则表达式_Java_Regex_Regex Negation - Fatal编程技术网

如何在Java中否定任何正则表达式

如何在Java中否定任何正则表达式,java,regex,regex-negation,Java,Regex,Regex Negation,我有一个正则表达式,我想否定它,例如 /(.{0,4}) 哪个String.matches返回以下内容 "/1234" true "/12" true "/" true "" false "1234" false "/12345" false 是否有一种方法(仅使用regx)对上述内容进行否定,从而得出以下结果: "/1234" false "/12" false "/" false "" true "1234" true "/12345" true 我正在寻找一个通用的解决方案,它可以在

我有一个正则表达式,我想否定它,例如

/(.{0,4})
哪个String.matches返回以下内容

"/1234" true
"/12" true
"/" true
"" false
"1234" false
"/12345" false
是否有一种方法(仅使用regx)对上述内容进行否定,从而得出以下结果:

"/1234" false
"/12" false
"/" false
"" true
"1234" true
"/12345" true
我正在寻找一个通用的解决方案,它可以在不重写整个正则表达式的情况下适用于任何正则表达式

我已经看了以下内容 使用(?!模式),但这似乎不适合我

下面的regx

(?!/(.{0,4}))
返回以下内容:

"/1234" false
"/12" false
"/" false
"" true
"1234" false
"/12345" false
这不是我想要的。
任何帮助都将不胜感激。

您需要添加锚定。原始正则表达式(减去不需要的括号):

…匹配包含斜杠和零到四个字符的字符串。但是,因为您使用的是
matches()
方法,所以它会自动锚定,好像它真的是:

^/.{0,4}$
要实现相反的效果,你不能依赖自动锚定;您必须在前瞻中至少明确结束锚定。您还必须用
*
填充正则表达式,因为
匹配()
需要正则表达式使用整个字符串:

(?!/.{0,4}$).*
但我建议您明确地锚定整个正则表达式,如下所示:

^(?!/.{0,4}$).*$

它并没有害处,而且它使您的意图非常清楚,特别是对于从其他风格(如Perl或JavaScript)学习正则表达式的人。
matches()
方法的自动锚定是非常不寻常的。

我知道这是一个非常古老的问题,但希望我的答案能帮助将来寻找这个问题的任何人

While的答案几乎是正确的。您还需要对整个正则表达式进行分组,否则您可能只锚定原始正则表达式的一部分

例如,如果要对以下正则表达式求反:
abc | def
(与
“abc”
“def”

(?!
前面加上
$).
。您将得到
(?!abc|def$).

String negateRegex(String regex) {
    return "(?!(?:" + regex + ")$).*";
}
这里的锚只适用于
def
,这意味着
“abcx”
在应该匹配的时候将不匹配

我宁愿在
(?!(?:
之前加上
)$).

String negateRegex(String regex) {
    return "(?!(?:" + regex + ")$).*";
}

从我的测试来看,它看起来像
negateRegex(negateRegex(regex))
在功能上确实与
regex

相同,难道你不能匹配并否定它是否匹配吗?这是任何正则表达式的通用解决方案,不重写正则表达式。这种匹配的编码是现有框架的一部分,在不破坏其他东西的情况下无法更改。这对任何正则表达式都有效吗?i、 e.
String-negateRegex(String-regex){return“(?!”+regex+“$)*”}
会像预期的那样工作吗?这会否定它自己吗?也就是说,
negateRegex(negateRegex(regex))
在功能上与
regex
相同吗?嗯,我在这里做了一些初步测试[1]在我尝试过的所有情况下,它似乎都在起作用,包括否定否定。(1)我不相信你能操纵类似正则表达式的字符串。你考虑Q和E吗?你最后考虑反斜杠吗?