转义字符和正则

我们在写代码时,使用的是字符来表达,这些字符是编程语言定义的关键字或保留字,他们可以是单词或者单个字符。一段Java代码如下:

    public FileInputStream(File file) throws FileNotFoundException {
        String name = (file != null ? file.getPath() : null);
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(name);
        }
        if (name == null) {
            throw new NullPointerException();
        }
        if (file.isInvalid()) {
            throw new FileNotFoundException("Invalid file path");
        }
        fd = new FileDescriptor();
        fd.attach(this);
        path = name;
        open(name);
        altFinalizer = getFinalizer(this);
        if (altFinalizer == null) {
            FileCleanable.register(fd);       // open set the fd, register the cleanup
        }
    }

唯一不同就是这里面出现了用引号包起来的一段字符串,这个字符串里可以写任意字符,我们称这种值为字面值。字符串是人类生活中使用的书面语言在程序中建模的产物,所以对于生活中一些不方便用字面值表达的字符,人们设计了一些等价的表达方式,称为转义字符。如你的程序中使用一个String变量存储一篇文章,文章里面是有换行符,制表符,引号字符,这些符号有的不好直接输入,如换行,有的会影响程序编写格式,如引号。此时就需要使用转义字符来表达,转义字符以反斜杠开头,外加一个转义符号,如回车:\r,换行:\n,制表符:\t,引号:\",这样就可以在字面值上表示这些含义:
如一段文字在程序中表达的方式如下:

This is an "good boy"

String str = "This is a \"good boy\"\n";

正则中使用

比如有一段文字是:

This is \

在程序中表达方式是:

String str = "This is a \\";

因为反斜杠是表示转义字符的标识符,所以如果想表达原生反斜杠,就要使用2个反斜杠,解释程序读到第一个反斜杠,知道要是转义字符开始了,紧接读取紧挨的第二个字符,发现是是一个斜杠字符,就知道这2个字符要表达的意思是一个反斜杠了。

如果此时需求是要将反斜杠替换成字符x,那要怎么写?replaceAll()接受2个字符串作为参数。

str.replaceAll("", "x");

写1个\肯定不行,str.replaceAll("\", "x");
这样程序编写层面就过不了,编译器发现\",认为这是字符串的值,进而继续往后需要第二个引号作为字符串的结果,结果找到x开头前的引号,这样完全错位了,编译就会报错。

写2个\\,str.replaceAll("\\", "x");
可以通过程序编译,因为这个函数接受2个字符串变量,2个\\表示一个\字面量。但是运行时会报错,因为在编程这种场景下,正则引擎拿到的是一个字符串变量值是\,关键是正则引擎作为一个系统化解析软件,他也必须接受转义字符的输入,因为如果你要替换换行时,你的输入是\n,此时你要求正则识别转义,而另一种场景下,你只输入一个\,又要求正则将\不要当作转义字符,这是办不到的,所以正则的做法是认为以\开头都是转义。所以这里写\\是不行的,正则认为转义字符表达不完整。

写3个\\\,就是编译器报语法错误了,和写1个\的报错原因一样。

写4个\\\\,是正确的,传输给正则引擎的是\\,此时正则能解析出转义字符,认为要替换掉\字符。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值