Java 我可以定义自定义字符类速记吗?
Java提供了一些有用的字符类,如Java 我可以定义自定义字符类速记吗?,java,regex,customization,Java,Regex,Customization,Java提供了一些有用的字符类,如\d和\w。我可以定义自己的角色类吗?例如,能够为字符类定义速记将非常有用,例如[A-Za-z!]是和否。是,因为[]已经是一个字符类。不,您不能定义像\w这样的自定义“快捷方式”。一个原因是,这从来不是JAVAs的决定。这些字符类在其他地方标准化(POSIX?) 我的2分:正则表达式本身就足够复杂了。你不应该引入更多的东西来混淆你自己和其他人。我想你说的是在正则表达式中使用这些自定义快捷方式?如果是这样,答案是否定的,除非您编写自己的正则表达式解析器(这是您不
\d
和\w
。我可以定义自己的角色类吗?例如,能够为字符类定义速记将非常有用,例如[A-Za-z!]
是和否。是,因为[]
已经是一个字符类。不,您不能定义像\w
这样的自定义“快捷方式”。一个原因是,这从来不是JAVAs的决定。这些字符类在其他地方标准化(POSIX?)
我的2分:正则表达式本身就足够复杂了。你不应该引入更多的东西来混淆你自己和其他人。我想你说的是在正则表达式中使用这些自定义快捷方式?如果是这样,答案是否定的,除非您编写自己的正则表达式解析器(这是您不想做的事情)。这些快捷方式是预定义规范的一部分,无法更改。我想,如果您不想编写自己的完整正则表达式引擎,那么最接近的方法就是编写一个字符串预处理器,将包含速记符号的字符串转换为另一个扩展符号的字符串 我可以定义自己的角色类吗 不,你不能 就我个人而言,当我有一个(稍微)复杂的正则表达式时,我会将正则表达式分解成更小的子正则表达式,然后用
String.format(…)
将它们“粘合”在一起,如下所示:
public static boolean isValidIP4(String address) {
String block_0_255 = "(0|[1-9]\\d|2[0-4]\\d|25[0-5])";
String regex = String.format(
"%s(\\.%s){3}",
block_0_255, block_0_255
);
return address.matches(regex);
}
这比单一模式更具可读性:
"(0|[1-9]\\d|2[0-4]\\d|25[0-5])(\\.(0|[1-9]\\d|2[0-4]\\d|25[0-5])){3}"
请注意,这只是一个简单的示例:验证IP地址可能最好由java.net
包中的类来完成,如果这样做的话,应该将模式放在方法之外并进行预编译
注意图案中的
%
符号 这只是一个例子:)想象一下重复出现的更复杂的字符类。@Martinho,它还包括\d
Ok。我的评论有点错误<代码>[\w\uz]与[A-Za-z\uz]
不完全相同<代码>\w是字母、数字和下划线。我认为,Unicode是有意识的。噢。@Martinho,别往心里去…:-)我正要亲自提出一些建议。如果需要大量重用,可以将这些正则表达式部分保存在常量中。回答得好!我来这里是想找主意。这对Python的作用几乎相同。没想到这件事,我觉得很傻。它对grep命令行没有太大帮助,除非你对foo='(0 |[1-9]\d | 2[0-4]\d | 25[0-5])这样的东西发疯了;grep-E“${foo}(\\.${foo}){3}”bar.txt”。事实上,这并不可怕。。。它在find的-exec操作符中工作吗?六羟甲基三聚氰胺六甲醚。。。。是时候做实验了。。。。起初,我没有分号,在“foo”的定义之后,我没有分号,但当然,我所做的只是为grep的执行环境定义“foo”,这不是它的内涵。我试图设计出一个命令行,该命令行不会因为大量临时的小字符串而污染shell会话。我希望在一个环境中添加一个额外的foo定义,以帮助指定grep-re。将整个过程放入子shell是可行的,但这可能会增加其他副作用。(f='(0 |[1-9]\d | 2[0-4]\d | 25[0-5]);grep-E“${f}(\\\.${f}{3}”bar.txt)Java模仿Perlre
s,就像几乎所有其他re
库一样。Perlre
s是事实上的标准。