有什么区别:
[xyz]
[x|y|z]
如果有的话? []和|指定替代方案。
以下代码打印完全相同的结果:
String string = "the x and the y and the z and the nothing";
evaluatePattern(Pattern.compile("\\w*[xyz]\\w*"), string);
evaluatePattern(Pattern.compile("\\w*[x|y|z]\\w*"), string);
答案 0 :(得分:7)
[xyz]
仅匹配三个字符 - x
,y
,z
。它与(x|y|z)
[x|y|z]
匹配4个字符 - x
,y
,z
,|
。它与(x|y|z|\|)
请注意,pipe(|)
在Character Class内没有特殊意义。
答案 1 :(得分:3)
正如其他人所说,[x|y|z]
将匹配四个字符中的一个 - x
,y
,z
或|
。这是因为,在字符类内部(与正则表达式中的其他地方不同),大多数情况下,唯一的“特殊字符”是]
,它结束了字符类。
同样,这个:[.^$|]
将匹配五个字符中的一个 - .
,^
,$
或|
。
此规则有一些“例外” - 例如:[^abc]
将匹配任何单个字符不 a
,b
或{{ 1}}。您还可以指定一系列字符 - 例如,c
匹配任何一个小写字母。
还应该注意的是,对于大多数正则表达式引擎,尽管像[a-z]
这样的字符不需要在字符类中转义,但.
仍然被认为是试图逃避它们。例如,\
仅匹配字符[\.]
,而.
匹配其中一个字符[\\.]
或\
。
可以在此处找到有关字符类的更全面的解释:http://www.regular-expressions.info/charclass.html。特别要注意标题为“字符类内的元字符”的部分。
答案 2 :(得分:1)
模式[x|y|z]
将与字符串"|"
匹配,而[xyz]
则不匹配。括号创建character class,其中包含字符x
,y
,z
和|
。
答案 3 :(得分:0)
[xyz]
是一组字符x
,y
和z
[x|y|z]
是一组字符x
,y
和z
以及|
其中一个人有一个额外的角色,它会匹配。
答案 4 :(得分:0)
[xyz]
实际上等同于(?:x|y|z)
,但它们可能有不同的内部表示形式。第二个可能更慢。我刚刚更改它以删除捕获组。
答案 5 :(得分:0)
如有疑问,只需查看this cheat sheet,了解不同正则表达式及其规则的示例。
希望它有所帮助。