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"))