必发88登录

首页 > 正文

String.replaceAll方法,正则妙用

www.chefhunger.com2019-08-07
88必发网页版登录

  千锋JAVA开发学院2天前我要分享

我通常不太关心代码的具体实现,因为我的开发语言非常复杂,并且倾向于解决一些最简单和最常见的方法。我不小心看到组中的朋友发送了以下java代码。我觉得我仍然非常有限和无知:

从输出中可以看出,此代码用于将下划线命名格式的字符串替换为下划线。这个功能相对简单,但吸引我的是他的代码。

createTime.replaceAll(([A-Z] +),_ $ 1)

这行代码非常简单,就是调用String类的replaceAll方法,该方法的第一个参数是正则表达式,第二个参数是要替换的新值。

让我感到惊讶的是,在他的代码中,replaceAll的第二个参数,即JDK文档中名为replacement的参数,实际上是_ $ 1。这是什么鬼?还支持占位符之类的东西?我一直都不知道。

问题探索

由于我以前研究过正则表达式,通过观察replaceAll的第一个参数([AZ] +),我想这应该是一组正则表达式,对应于JDK,即java.util.regex.Matcher组方法班上的。

在Linux Sed命令上。有一些替代品的使用,原因应该是相同的。

所以我看到了String.replaceAll方法是如何实现的。 JDK:

哦,事实证明它在底部使用了Matcher,但它使用了Matcher自己的replaceAll方法。

要查看其文档,此方法的参数实际上是鬼,请参阅下面的实现代码。

关键部分是文档中的appendReplacement方法,您可以看到详细的描述文档。

看这里要理解,这个方法的替换参数可以使用$ character来指代Matcher的分组,通过常规匹配,支持名称和数字两种方式,这里对应于Matcher的组(名称)和组(int) class)两种方法。

结论

1,String的replaceAll方法实际上是由java.util.regex.Matcher类的replaceAll方法实现的。

java.util.regex.Matcher类的replaceAll方法通过调用appendReplacement方法来实现替换逻辑。

3,Matcher类的appendReplacement方法的替换参数支持通过$ symbol匹配Matcher的分组

以下代码是使用Matcher类进行分组的最佳实践。

组(0)表示整个字符串

组(1)表示第一个匹配,在上例中(我的手机号码是:([0-9] {11}))

组(2)表示第二场比赛。在上面的例子中,([0-9] {11})部分是

使用分组可以用来提取字符串中的目标字符串值,这非常有用!

几个例子

以下是一些可用于绕过的示例。

驼峰有下划线

强调驼峰

这个稍微麻烦的一点是由模仿器Matcher.replaceAll方法编写的。

publicstaticStringunderlineToCamel(StringunderlineName){

Matchermatcher=Pattern.compile((_ [A-Z] {1}))匹配(underlineName);

StringBufferresult=newStringBuffer;

而(matcher.find){

Stringreplacement=matcher.group(1);

matcher.appendReplacement(结果,replacement.replace(_)toUpperCase。);

}

matcher.appendTail(结果);

returnresult.toString;

}

另外,MybatisGenerator插件的源代码也提供了类似的方法(JavaBeansUtil.getCamelCaseString),这里做了一个简单的修改

没有复杂的定期参与,速度会快得多。

看一些优秀的开源代码,你真的可以找到一些实用的技巧。这比重复制造一些车轮要有效得多。时间花在刀片上,但不能用于切割豆腐。

收集报告投诉

我通常不太关心代码的具体实现,因为我的开发语言非常复杂,并且倾向于解决一些最简单和最常见的方法。我不小心看到组中的朋友发送了以下java代码。我觉得我仍然非常有限和无知:

从输出中可以看出,此代码用于将下划线命名格式的字符串替换为下划线。这个功能相对简单,但吸引我的是他的代码。

createTime.replaceAll(([A-Z] +),_ $ 1)

这行代码非常简单,就是调用String类的replaceAll方法,该方法的第一个参数是正则表达式,第二个参数是要替换的新值。

让我感到惊讶的是,在他的代码中,replaceAll的第二个参数,即JDK文档中名为replacement的参数,实际上是_ $ 1。这是什么鬼?还支持占位符之类的东西?我一直都不知道。

问题探索

由于我以前研究过正则表达式,通过观察replaceAll的第一个参数([AZ] +),我想这应该是一组正则表达式,对应于JDK,即java.util.regex.Matcher组方法班上的。

在Linux Sed命令上。有一些替代品的使用,原因应该是相同的。

所以我看到了String.replaceAll方法是如何实现的。 JDK:

哦,事实证明它在底部使用了Matcher,但它使用了Matcher自己的replaceAll方法。

要查看其文档,此方法的参数实际上是鬼,请参阅下面的实现代码。

关键部分是文档中的appendReplacement方法,您可以看到详细的描述文档。

看这里要理解,这个方法的替换参数可以使用$ character来指代Matcher的分组,通过常规匹配,支持名称和数字两种方式,这里对应于Matcher的组(名称)和组(int) class)两种方法。

结论

1,String的replaceAll方法实际上是由java.util.regex.Matcher类的replaceAll方法实现的。

java.util.regex.Matcher类的replaceAll方法通过调用appendReplacement方法来实现替换逻辑。

3,Matcher类的appendReplacement方法的替换参数支持通过$ symbol匹配Matcher的分组

以下代码是使用Matcher类进行分组的最佳实践。

组(0)表示整个字符串

组(1)表示第一个匹配,在上例中(我的手机号码是:([0-9] {11}))

组(2)表示第二场比赛。在上面的例子中,([0-9] {11})部分是

使用分组可以用来提取字符串中的目标字符串值,这非常有用!

几个例子

以下是一些可用于绕过的示例。

驼峰有下划线

强调驼峰

这个稍微麻烦的一点是由模仿器Matcher.replaceAll方法编写的。

publicstaticStringunderlineToCamel(StringunderlineName){

Matchermatcher=Pattern.compile((_ [A-Z] {1}))匹配(underlineName);

StringBufferresult=newStringBuffer;

而(matcher.find){

Stringreplacement=matcher.group(1);

matcher.appendReplacement(结果,replacement.replace(_)toUpperCase。);

}

matcher.appendTail(结果);

returnresult.toString;

}

另外,MybatisGenerator插件的源代码也提供了类似的方法(JavaBeansUtil.getCamelCaseString),这里做了一个简单的修改

没有复杂的定期参与,速度会快得多。

看一些优秀的开源代码,你真的可以找到一些实用的技巧。这比重复制造一些车轮要有效得多。时间花在刀片上,但不能用于切割豆腐。

热门浏览
热门排行榜
热门标签
日期归档