Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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 为什么';t[[a-z]*“捕获”;卑诗省;,但是";b";?_Java_Regex - Fatal编程技术网

Java 为什么';t[[a-z]*“捕获”;卑诗省;,但是";b";?

Java 为什么';t[[a-z]*“捕获”;卑诗省;,但是";b";?,java,regex,Java,Regex,好的,所以我试着更加熟悉正则表达式中的交集(&&)。 页面上解释了所有正则表达式,&&仅在范围旁边使用(如[a-z&&[^e]]])。但是我试着这样使用它:[[a-z]*&&&[^a]]。在我看来,这似乎符合逻辑,它将匹配所有小写字符串,除了字符串“a”,但它似乎与[a-z&&[^a]]等效 所以实际的问题是:*操作员去了哪里?如何只捕获单个字符串?Java支持字符类交集。问题在于,在字符类中,*失去了它的特殊含义,而文字星号“*”将被匹配。您的正则表达式应该是: [a-z&&[

好的,所以我试着更加熟悉正则表达式中的交集(
&&
)。 页面上解释了所有正则表达式,
&&
仅在范围旁边使用(如
[a-z&&[^e]]]
)。但是我试着这样使用它:
[[a-z]*&&&[^a]]
。在我看来,这似乎符合逻辑,它将匹配所有小写字符串,除了字符串
“a”
,但它似乎与
[a-z&&[^a]]
等效


所以实际的问题是:
*
操作员去了哪里?如何只捕获单个字符串?

Java支持字符类交集。问题在于,在字符类中,
*
失去了它的特殊含义,而文字星号“*”将被匹配。您的正则表达式应该是:

[a-z&&[^a]]*
现在,它将匹配“a-z”范围内除“a”字符以外的所有字符


例如:

Pattern p = Pattern.compile("[a-z&&[^a]]");
Matcher m = p.matcher("a");
System.out.println(m.matches()); // false
在字符类(由
[]
标记)中,
*
字符没有特殊含义。它只是代表角色本身

所以正则表达式

[[a-z]*&&[^a]]
仅允许一个字符为以下字符之一:

b, c, d, ..., z, *
[a-z]
和下面的
*
被联合起来,产生的字符类与
[^a]
相交,这只会删除
a
字符

有效字符串包括(例如):

但是

不是,以及包含多个字符的每个字符串

现在来看看你想要的解决方案。您希望字符串(我假设允许多个字符)也可以包含字母“a”,但不能仅包含字符串“a”。最简单的是一个有这种区别的小组:

(?!a$)[a-z]*

(?!a$)
称为零宽度负前瞻。这意味着未使用已查看的字符(零宽度),也不允许使用该字符(负数)。“$”字符看起来一直到结尾。否则,以“a”开头的单词也将被拒绝。

尝试在课外使用
*

[[a-z]&&[^a]]*

截取两个字符类可以得到另一个字符类。
正如其他答案所说,
*
并不意味着课堂内的数量。所以,在外部使用它。

我认为使用交集的方法是错误的:匹配所有小写字符串,除了
“a”

调用
matches()
时,可以放下包装
^
$

当然你不需要正则表达式。虽然它有点冗长:

if (input.equals(input.toLowerCase()) && !input.equals("a"))

但是你可以更容易地阅读。

但是它仍然不匹配
“abc”
;(@Neuron因为“a”在那里,这不是你想要的吗?自我引用:>“对我来说,这似乎符合逻辑,它将匹配所有小写字符串,除了字符串“a”……这几乎是我想要的……但实际问题不是“我如何实现这一点?”“总之,这不是真的relevant@Neuron“对我来说,这将匹配所有小写字符串似乎是合乎逻辑的,除了字符串\“a \”-这正是上面的代码所做的。我不明白你的问题。是不是“*失去了它的意义…”够清楚了吗?谢谢你的尝试,但这不是问题所在。而且它与“abc”不匹配我想你是唯一一个明白OP想要什么的人。这确实是我最初尝试做的。不幸的是,这不是问题,而是+1。最后一行没有任何帮助,因为这只是一个示例,我需要排除很多字符串,但第一行有帮助!@neuron yes y您可以将负面外观链接起来,例如要排除“foo”、“bar”和“baz”,请使用:
^(?(foo | bar | baz)$)[a-z]+$
-请参阅,如果您确实想提供符合我要求的正则表达式,则正则表达式也必须匹配
“abc”
。引用我自己的话:“所有小写字符串,除了字符串“a”是什么让这成为一个糟糕的问题?告诉我,我会解决它,只是否决投票永远不会帮助这个问题提高质量。@seelenvirtuse当人们努力理解某些东西时,往往是因为他们不知道错误在哪里。如果我知道我的问题是由角色类引起的,我会读到这一点。重点是,你应该知道,如果你在参考资料XY上查过的话,你几乎可以告诉99%的人关于XY的问题
(?!a$)[a-z]*
^(?!a$)[a-z]+$
if (input.matches("(?!a$)[a-z]+")) {
    // it's an all-lowercase string, but not "a"
}
if (input.equals(input.toLowerCase()) && !input.equals("a"))