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

Java 使用双引号封装时,转义序列与预定义字符类(也称为特殊正则表达式字符)的比较

Java 使用双引号封装时,转义序列与预定义字符类(也称为特殊正则表达式字符)的比较,java,python,regex,perl,Java,Python,Regex,Perl,Perl与Java和Python一样,除了其他特殊字符外,还具有与空格匹配的特殊正则表达式字符\s 在Perl中,以下内容无效: my$sense=“结束”; 我的$subStr=“\s”#不工作,需要是“\\s”或“\s” 如果($SECTION=~/$subStr/) { 说“真”; } 在Java中,这是有效的: String s=“结束”; if(s.matches(“.\\s.”)//与Perl(“\\s”)的处理相同 { System.out.println(“真”); } 在P

Perl与Java和Python一样,除了其他特殊字符外,还具有与空格匹配的特殊正则表达式字符
\s

在Perl中,以下内容无效:

my$sense=“结束”;
我的$subStr=“\s”#不工作,需要是“\\s”或“\s”
如果($SECTION=~/$subStr/)
{
说“真”;
}
在Java中,这是有效的:

String s=“结束”;
if(s.matches(“.\\s.”)//与Perl(“\\s”)的处理相同
{
System.out.println(“真”);
}
在Python中,可以使用
“\s”
“\s”

Java和Perl似乎都对
封装的特殊正则表达式字符进行了相同的处理。我查了一下(Java),它只是说:“如果在字符串文本中使用转义构造,那么必须在反斜杠之前加上另一个反斜杠,才能编译字符串。”

为什么Java和Perl对转义序列的处理不同于特殊的正则表达式字符(当它们都被
封装时),而python却没有

正如为什么设计者选择转义序列(如
\n
\t
)需要一个反斜杠,而对于预定义的字符类(如
\s
)则需要两个反斜杠一样(在
”)

这是其他原因造成的吗?或者它在某种程度上简化了某种互动,或者你做了什么


我想这不是武断的。Python只需要
\
两种方式,而Perl和Java在处理
时要求
\
。除了有点混乱之外,它还很混乱。所以,我认为这个决定是有充分理由的。有人知道为什么吗?

Java、Perl和Python都使用C风格的反斜杠进行转义。正则表达式还使用C样式的反斜杠进行转义。这导致了所有三种语言的问题,事实上,对许多其他语言也是如此

例如,所有三种语言在进入regex编译器之前都会将
'\\'
转换为一个反斜杠,
'\n'
转换为换行符等

唯一的区别是,在Python中,像
'\s'
这样的未知转义序列会自行解析,而在Java和Perl中,它们只解析为
's'
。因此,在Python中,虽然需要
'\\\n'
,但不需要
'\\s'
,而在Java和Perl中,需要避开这两种语言的反斜杠

还有一些语言做出了第三种选择,将未知转义序列视为错误


因此,如果您记住了已知转义的列表,那么您有时可以在Python中不转义反斜杠。但你真的不应该

为什么不呢?因为,即使你绝对确定你已经记住了转义序列,你真的想让任何想阅读(或维护)你的代码的人都必须记住转义序列吗?当我看到
“abc\\sdef”
r“abc\sdef”
时,我立刻知道它的确切含义。当我看到unescaped
“abc\sdef”
时,我想我知道了,但我可能错了,我必须去查找它或在解释器中尝试它才能找到答案


正确的做法是避开反斜杠,或者为您的语言使用适当的原始字符串或正则表达式文字语法



如果您想知道为什么Python对Perl和Java中的未知转义做出了不同的设计选择……据我所知,这在官方中没有涉及,Guido也没有直接解决。但我能猜到。一般来说,Perl与C(Java与C++)的最大兼容性在许多领域都是优先考虑的,在这些领域,Python更重视对编程老师来说更直观的东西。这可能是其中一个领域。(我怀疑,如果Python是今天从头开始重新设计的,或者甚至是在添加原始字符串的时候重新设计的,就会出现错误。)

Java、Perl和Python都使用C风格的反斜杠进行转义。正则表达式还使用C样式的反斜杠进行转义。这导致了所有三种语言的问题,事实上,对许多其他语言也是如此

例如,所有三种语言在进入regex编译器之前都会将
'\\'
转换为一个反斜杠,
'\n'
转换为换行符等

唯一的区别是,在Python中,像
'\s'
这样的未知转义序列会自行解析,而在Java和Perl中,它们只解析为
's'
。因此,在Python中,虽然需要
'\\\n'
,但不需要
'\\s'
,而在Java和Perl中,需要避开这两种语言的反斜杠

还有一些语言做出了第三种选择,将未知转义序列视为错误


因此,如果您记住了已知转义的列表,那么您有时可以在Python中不转义反斜杠。但你真的不应该

为什么不呢?因为,即使你绝对确定你已经记住了转义序列,你真的想让任何想阅读(或维护)你的代码的人都必须记住转义序列吗?当我看到
“abc\\sdef”
r“abc\sdef”
时,我立刻知道它的确切含义。当我看到unescaped
“abc\sdef”
时,我想我知道了,但我可能错了,我必须去查找它或在解释器中尝试它才能找到答案


正确的做法是避开反斜杠,或者为您的语言使用适当的原始字符串或正则表达式文字语法


如果您想知道为什么Python对Perl和Java中的未知转义做出了不同的设计选择……据我所知,这在官方中没有涉及,Guido也没有直接解决。但我能猜到。一般来说,Perl与C(以及Java与C++)的最大兼容性在许多领域都是优先考虑的,而Python在这些领域更为优先