Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Customization - Fatal编程技术网

Java 我可以定义自定义字符类速记吗?

Java 我可以定义自定义字符类速记吗?,java,regex,customization,Java,Regex,Customization,Java提供了一些有用的字符类,如\d和\w。我可以定义自己的角色类吗?例如,能够为字符类定义速记将非常有用,例如[A-Za-z!]是和否。是,因为[]已经是一个字符类。不,您不能定义像\w这样的自定义“快捷方式”。一个原因是,这从来不是JAVAs的决定。这些字符类在其他地方标准化(POSIX?) 我的2分:正则表达式本身就足够复杂了。你不应该引入更多的东西来混淆你自己和其他人。我想你说的是在正则表达式中使用这些自定义快捷方式?如果是这样,答案是否定的,除非您编写自己的正则表达式解析器(这是您不

Java提供了一些有用的字符类,如
\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模仿Perl
re
s,就像几乎所有其他
re
库一样。Perl
re
s是事实上的标准。