正则表达式谜题

时间:2023-02-25 22:31:39
我写了一个查找替换的程序,用两个JTextField来获取要查找和替换的字符串。问题是,如果输入的字符串中有“\”,则用getText()得到的字符串是"\\"。比如,输入“\r\n”,得到的是“\\r\\n”。但把这些字符串用于正则表达式时,查找和替换的是反斜杠加n,而非换行符。
我的一个解决办法是在使用之前用replace("\\r","\r"),但这种方式很丑,而且不能一次性处理所有相类似的情况,不知道有没有人能够给出理想的解决方法。

16 个解决方案

#1


replace("\\","\");
这个好像通用一些了吧

#2


楼上的,你有试过这行代码吗?如果没有,请去试一下。

#3


我对于正则不是很熟悉,只是略知一点。
那会有什么问题呢?你说一下,我可以帮你一起想啊。这语法不熟悉,但算法也可以帮你想的啊。
是不是刚才那样就会变成\后面一个字母。
replace("\\","\")+后一个字母;这样再组成一个字符,可以吗?

#4


这是不可能的,你自己试一下就知道了。因为"\"这样的,是非法的表达。

#5


引用楼主 jrlgz 的回复:
比如,输入“\r\n”,得到的是“\\r\\n”

输入"\r\n",那是输入了\ r \ n四个字符
转义符是给编译器处理用的,不是让你自己用的

#6


你要是想换行,就直接敲回车
表示为String就是"\r\n",不等于你自己输入\r\n就是换行,不要弄混了。。。

#7


应该输入的是"\\\\r\\\\n",因为引用java的转义是"\\r\\n"正则也要用传义,就成了"\\\\r\\\\n"了!我认为是这样的不知道对不对!

#8


replace("\\\\", "\\")
这不就好了,把两个反斜杠换成一个

#9


回复六楼:如果要把Windows换行符替换成Unix换行符呢?用回车的方法根本不能发挥正则的威力。
回复七楼:不对,如果照你那样输入,getText的结果是\\\\\\\\r\\\\\\\\n
回复八楼:getText后取得的是“\\r”,而非“\\\\r”,怎么替换?

#10


回复五楼:你说得很对。但是如果要实现这样的需要,就是在编辑框里输入正则式,然后执行替换,要怎么办?

#11


引用 9 楼 jrlgz 的回复:
回复六楼:如果要把Windows换行符替换成Unix换行符呢?用回车的方法根本不能发挥正则的威力。
回复七楼:不对,如果照你那样输入,getText的结果是\\\\\\\\r\\\\\\\\n
回复八楼:getText后取得的是“\\r”,而非“\\\\r”,怎么替换?

回复八楼:getText后取得的是“\\r”,而非“\\\\r”,怎么替换?
你试一下就知道了,\\\\代表2个斜杠

#12


楼上的,把两个反斜杠替换成一个有什么用啊?正则式还是会去找一个反斜杠和一个字母,而不是换行符。如果你自己写代码运行一下,你就知道到底问题是什么了。

#13


额,你就是要保留换行模式咯
试试这个
replaceAll("\\\\[nr]", System.getProperty("line.separator"));
要用replaceAll,replace不行

#14


你这个还是回到我的老路上去了。看来没有别的法子,只有把这些字符一一替换了。

#15


是我自己钻牛角尖了。其实也没有几个这样的符号。主要是一些非打印符。用下面这几行代码就可以处理这个问题了。
        String[] ls={"\\r","\\n","\\t","\\b","\\f"};
        String[] rs={"\r","\n","\t","\b","\f"};

        for(int i=0;i<ls.length;i++){
            res=res.replace(ls[i], rs[i]);
        }

#16


呵呵,对了

简单问题就用简单办法解决了

#1


replace("\\","\");
这个好像通用一些了吧

#2


楼上的,你有试过这行代码吗?如果没有,请去试一下。

#3


我对于正则不是很熟悉,只是略知一点。
那会有什么问题呢?你说一下,我可以帮你一起想啊。这语法不熟悉,但算法也可以帮你想的啊。
是不是刚才那样就会变成\后面一个字母。
replace("\\","\")+后一个字母;这样再组成一个字符,可以吗?

#4


这是不可能的,你自己试一下就知道了。因为"\"这样的,是非法的表达。

#5


引用楼主 jrlgz 的回复:
比如,输入“\r\n”,得到的是“\\r\\n”

输入"\r\n",那是输入了\ r \ n四个字符
转义符是给编译器处理用的,不是让你自己用的

#6


你要是想换行,就直接敲回车
表示为String就是"\r\n",不等于你自己输入\r\n就是换行,不要弄混了。。。

#7


应该输入的是"\\\\r\\\\n",因为引用java的转义是"\\r\\n"正则也要用传义,就成了"\\\\r\\\\n"了!我认为是这样的不知道对不对!

#8


replace("\\\\", "\\")
这不就好了,把两个反斜杠换成一个

#9


回复六楼:如果要把Windows换行符替换成Unix换行符呢?用回车的方法根本不能发挥正则的威力。
回复七楼:不对,如果照你那样输入,getText的结果是\\\\\\\\r\\\\\\\\n
回复八楼:getText后取得的是“\\r”,而非“\\\\r”,怎么替换?

#10


回复五楼:你说得很对。但是如果要实现这样的需要,就是在编辑框里输入正则式,然后执行替换,要怎么办?

#11


引用 9 楼 jrlgz 的回复:
回复六楼:如果要把Windows换行符替换成Unix换行符呢?用回车的方法根本不能发挥正则的威力。
回复七楼:不对,如果照你那样输入,getText的结果是\\\\\\\\r\\\\\\\\n
回复八楼:getText后取得的是“\\r”,而非“\\\\r”,怎么替换?

回复八楼:getText后取得的是“\\r”,而非“\\\\r”,怎么替换?
你试一下就知道了,\\\\代表2个斜杠

#12


楼上的,把两个反斜杠替换成一个有什么用啊?正则式还是会去找一个反斜杠和一个字母,而不是换行符。如果你自己写代码运行一下,你就知道到底问题是什么了。

#13


额,你就是要保留换行模式咯
试试这个
replaceAll("\\\\[nr]", System.getProperty("line.separator"));
要用replaceAll,replace不行

#14


你这个还是回到我的老路上去了。看来没有别的法子,只有把这些字符一一替换了。

#15


是我自己钻牛角尖了。其实也没有几个这样的符号。主要是一些非打印符。用下面这几行代码就可以处理这个问题了。
        String[] ls={"\\r","\\n","\\t","\\b","\\f"};
        String[] rs={"\r","\n","\t","\b","\f"};

        for(int i=0;i<ls.length;i++){
            res=res.replace(ls[i], rs[i]);
        }

#16


呵呵,对了

简单问题就用简单办法解决了