为什么我在不同情况下使用不同数量的转义字符?

时间:2014-08-03 12:07:50

标签: java regex

使用Java中的正则表达式,为什么我应该编写"\n"来定义换行符和"\\s"来定义空格字符?

为什么反斜杠的数量不同?

3 个答案:

答案 0 :(得分:7)

Java自己进行字符串解析,将其从代码转换为内存中的内部字符串,然后将字符串发送到正则表达式解析器。

Java将2个字符\n转换为换行符(ASCII代码0x0A),将\\s中的前2个(!)字符转换为单个反斜杠:\s。现在字符串被发送到正则表达式解析器,并且由于正则表达式识别其自己的特殊转义字符,因此它将\s视为"任何空格& #34;

此时,代码\n已经存储为单个字符"换行",正则表达式不再处理它。

由于正则表达式将集合\n识别为"换行符#34;,您还可以在Java字符串中使用\\n - Java转换将\\转义为单个\,然后正则表达式模块找到\n,它(再次)被转换为换行符。

答案 1 :(得分:2)

Java字符串具有一组允许的escape sequences,其中" \ n"是一个,但" \ s"不是。字符串不能理解空格的正则表达式简写。您可能正在将Java字符串传递给RegExp构造函数,因此为了传递" \ s"作为一个字符串,你必须逃避" \"加倍。

答案 2 :(得分:2)

\是许多语言中的特殊字符(在Java中,它在Stringchar中很特殊)或者像regex这样的工具。

Stringchar中,它用于创建您通常无法写入的其他特殊字符。使用\x x表示您可以创建的特殊字符

  • \t标签
  • \b退格
  • \n换行
  • \r回车
  • \f formfeed

或逃避其他特殊字符

  • \'单引号('char中很特殊,因为它代表char开始和结束的位置,所以要实际写出'字符,你需要逃脱把它写成

    here we start creating character
    |  here we end creating character 
    ↓  ↓
    '\''
     ↑↑
     here we created literal of '
    
  • \"双引号 - 与\'中的char类似,字符串"代表其开始和结束的位置,因此放置"文字到字符串(实际上能够写它)你需要逃避它

    here we start creating String
    |  here we end creating String 
    ↓  ↓
    "\""
     ↑↑
     here we created literal of "
    
  • \\反斜杠 - 由于\是用于创建其他特殊字符的特殊字符,因此必须有一种非特殊字符的方法,因此我们实际上可以将\打印为简单的文字。

    问题:如何编写代表day\night的字符串?如果你以"day\night" it will be interpreted as天[换行符] ight`的方式写出这样的字符串。

    因此,在许多语言中代表\文字,在它之前添加另一个\以逃避它。因此,代表day\night的字符串需要写为"day\\night"(现在\ \n中的\n被转义,因此它不再代表\ - 换行符 - 而是连接n\s个字符)


如果正则表达式表示将接受任何空格的字符类,则需要实际传递\s
但是代表"\\s"的字符串需要写成\,因为前面在字符串\s中提到的是特殊的并且需要转义。
如果您将"\s"写为{{1}},那么您将获得