String.replaceAll方法,正则妙用

?

Qianfeng JAVA Development Institute我想分享3天前

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

image.php?url=0MmhUsJ0Y7

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

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方法。

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

image.php?url=0MmhUs8e56

关键部分是文档中的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类进行分组的最佳实践。

image.php?url=0MmhUs02Bc

组(0)表示整个字符串

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

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

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

几个例子

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

驼峰有下划线

强调驼峰

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

公共静态字符串underlineToCamel(String underlineName){

Matcher matcher=Pattern.compile((_ [a-z] {1}))。matcher(underlineName);

StringBuffer result=new StringBuffer;

而(matcher.find){

字符串替换=matcher.group(1);

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

}

matcher.appendTail(结果);

返回result.toString;

}

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

image.php?url=0MmhUsFJq7

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

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

收集报告投诉

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

image.php?url=0MmhUsJ0Y7

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

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方法。

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

image.php?url=0MmhUs8e56

关键部分是文档中的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类进行分组的最佳实践。

image.php?url=0MmhUs02Bc

组(0)表示整个字符串

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

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

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

几个例子

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

驼峰有下划线

强调驼峰

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

公共静态字符串underlineToCamel(String underlineName){

Matcher matcher=Pattern.compile((_ [a-z] {1}))。matcher(underlineName);

StringBuffer result=new StringBuffer;

而(matcher.find){

字符串替换=matcher.group(1);

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

}

matcher.appendTail(结果);

返回result.toString;

}

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

image.php?url=0MmhUsFJq7

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

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