- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java中replace、replaceAll和replaceFirst函数的用法小结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
首先概述一下他们三个的用法:
· replace(CharSequence target, CharSequence replacement) ,用replacement替换所有的target,两个参数都是字符串.
· replaceAll(String regex, String replacement) ,用replacement替换所有的regex匹配项,regex很明显是个正则表达式,replacement是字符串.
· replaceFirst(String regex, String replacement) ,基本和replaceAll相同,区别是只替换第一个匹配项.
接下来有个简单的需求,就是把源字符串中的a替换成\a,代码如下:
1
2
3
|
System.out.println(
"abac"
.replace(
"a"
,
"\\a"
));
//\ab\ac
System.out.println(
"abac"
.replaceAll(
"a"
,
"\\a"
));
//abac
System.out.println(
"abac"
.replaceFirst(
"a"
,
"\\a"
));
//abac
|
结果让人大吃一惊,用了这么多年的替换,竟然有点蒙了.
源字符串是"abac",然后我们找到"a",把它替换成\a,由于\是java转义字符,所以想表达\a必须写成"\\a",第一个反斜线将第二个反斜线转义成普通字符串.
三个替换表达式,只有第一个replace函数的结果是正确的,问题出在哪呢?
replaceAll和replaceFirst要求第一个参数是正则表达式,"a"既能理解成字符串a,也可以理解成正则表达式a,所以第一个参数没问题.
问题就出在第二个参数上,如果读者仔细阅读replaceAll函数的注释,会发现有如下说明:
1
|
Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use java.util.regex.Matcher.quoteReplacement to suppress the special meaning of these characters, if desired.
|
由于replaceAll和replaceFirst的第一个参数是正则,所以我们可以在第二个参数中做些小花样,比如有这样一个需求:把源字符串中的a替换成a后边紧邻的字符,代码如下:
1
2
|
System.out.println(
"abac"
.replaceAll(
"a(\\w)"
,
"$1$1"
));
//bbcc
System.out.println(
"abac"
.replaceFirst(
"a(\\w)"
,
"$1$1"
));
//bbac
|
正则的含义假设读者可以读懂,可以看出,在第二个参数中,可以用$符号获取分组的内容,本例中用$1取到了第一个分组的内容,即a后边紧邻的字符.
因此,$符号在第二个参数中是有特殊含义的,乱写会报错:
1
|
System.out.println(
"abac"
.replaceAll(
"a(\\w)"
,
"$"
));
//Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
|
那假如我就想替换成$呢?这就需要转义字符:
1
|
System.out.println("abac".replaceAll("a", "\\$")); //$b$c
|
到这,读者可能会恍然大悟,原来反斜线在第二个参数中也有特殊含义(转义),所以如果我们想表达反斜线,就必须再转义一次:
1
2
|
System.out.println(
"abac"
.replaceAll(
"a"
,
"\\\\a"
));
//\ab\ac
System.out.println(
"abac"
.replaceFirst(
"a"
,
"\\\\a"
));
//\abac
|
简单理解一下,"\\\\a"中前边的反斜线分别转义后边的反斜线,让后边的反斜线就是普通字符串,这样在java内存中看到的字符串就是"\\a",然后replaceAll函数在处理时,再用前边的反斜线转义后边的反斜线,来表达后边的反斜线就是普通字符串,不是用来转义$的,最终内存中的字符串就是"\a",这样才可以成功将a替换成\a.
总结 。
转义的问题确实纠结,通过本文,笔者希望读者以后使用这些函数时,能够保持清醒,能够意识到参数中的特殊字符,避免写出定时炸弹。以上就是这篇文章的全部内容,希望对大家的学习和工作能有所帮助,如果有疑问可以留言交流.
最后此篇关于Java中replace、replaceAll和replaceFirst函数的用法小结的文章就讲到这里了,如果你想了解更多关于Java中replace、replaceAll和replaceFirst函数的用法小结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在 Java 正则表达式中使用尖括号时,“\\") 与 replaceAll (""),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/q
我有个小问题。我有一段文字,我必须在浏览器中阅读几次。每次,我打开这个文本,自动启动一个我写的 replaceAll。它非常简单、基本,但问题是当我下次替换时(每次我阅读这篇文章时)我有一个 repl
你好:D简短的问题:有什么区别 String geb = tf_datum.getText(); String sep = ""; //sep is short for seperator geb =
这个问题在这里已经有了答案: regex: How to escape backslashes and special characters? (1 个回答) 关闭 8 年前。 replaceAll
String.replaceAll() 和 Matcher.replaceAll()(在从 Regex.Pattern 创建的 Matcher 对象上)在性能方面是否存在已知差异? 另外,两者在高级
我需要从字符串中删除一些字符。目前我正在尝试删除“”(空格)和“-”(连字符)。我试过两种方法。他们都在运行 Android N Beta 的 Nexus 5X 上工作。它们都不适用于搭载 Andro
我在一些论坛上读到这样的神话,即通过执行类似的操作就足以通过 Veracode CWE 117(日志的不正确输出中和)问题。有人可以确认是否是这种情况吗? message.replaceAll("\
我想在不区分大小写的搜索中使用变量(而不是字符串)执行 JavaScript replaceAll(),同时保留匹配文本的大小写(在返回中)。例如, console.log('doc.p:', doc
这只是我尝试完成的事情的示例代码。 String s = "hello(1234aA)something"; String replaceString = "(1234aa)"; String s2
我在数据库的表中有一组原始文本,我需要使用一组单词替换此集合中的一些单词。 我将所有要替换的术语及其替代项放在一个文本文件中,如下所示 min=admin lelet=lambat lemot=lam
string 类中的方法 replaceAll(String regex, String replacement) 将此字符串中与给定正则表达式匹配的每个子字符串替换为给定的替换。是否可以否定正则表达
文档页面:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
我想转换这个字符串 M,L,XL,XXL 到 size M,size L,size XL,size XXL 使用replaceAll()方法。可能吗? 最佳答案 您可以使用积极的前瞻来做到这一点。 S
两个问题: 已解决 将 $ 替换为另一个特殊字符 @ 并解决了问题。问题1 我有一个变量 String strVar ,其中包含以下文本(它从文件中读取)。现在我尝试使用 replaceAll() 替
考虑以下字符串: String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif"; 如何删除“stati
我需要一个正则表达式来执行以下替换: "\"Id\":\"123Abc\",\"foo\":\"bar\"" -> "\"Id\":null,\"foo\":\"bar\"" (change valu
我最近完成了以下编程练习:Acronym Generator 声明如下: In nearly every company each employee has a certain acronym con
所以这段代码按预期工作: String test = "ONE: this is a\ntest string."; System.out.println(test); test = test.rep
我有一个大的 json 存储在字符串中。我想更改字符串的某些部分,但收到此错误: Exception in thread "main" java.util.regex.PatternSyntaxExc
我编写了以下代码行: str.replaceAll("xxx(ayyy)xxx", "$1".substring(0,1).equals("a") ? "a" : "b"); 但是我发现“$1”.su
我是一名优秀的程序员,十分优秀!