做项目的时候有发现问题记录下的习惯,今天刚了解到点东西,发发牢骚而已
做解析域控制器(Active Directory)的用户和组织单位的时候需要对特殊符号的处理,
习惯性的 str.replaceAll("+","\\+");
结果出现java.util.regex.PatternSyntaxException
查询了下原因是要改变的字符序列中包含正则表达式中特殊的字符,用replace 就解决了。
那么replace 和replaceAll究竟有什么区别呢
帮助文档
replace:使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
replaceAll:使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
玩玩源码
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
不同之处
1.Pattern.LITERAL :
/**
* Enables literal parsing of the pattern.
*
* <p> When this flag is specified then the input string that specifies
* the pattern is treated as a sequence of literal characters.
* Metacharacters or escape sequences in the input sequence will be
* given no special meaning.
*
* <p>The flags CASE_INSENSITIVE and UNICODE_CASE retain their impact on
* matching when used in conjunction with this flag. The other flags
* become superfluous.
*
* <p> There is no embedded flag character for enabling literal parsing.
* @since 1.5
*/
public static final int LITERAL = 0x10;
在来个中文的
public static final int LITERAL
启用模式的字面值解析。
指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的元字符或转义序列不具有任何特殊意义。
2.Matcher.quoteRelacement()
/**
* Returns a literal replacement <code>String</code> for the specified
* <code>String</code>.
*
* This method produces a <code>String</code> that will work
* as a literal replacement <code>s</code> in the
* <code>appendReplacement</code> method of the {@link Matcher} class.
* The <code>String</code> produced will match the sequence of characters
* in <code>s</code> treated as a literal sequence. Slashes ('\') and
* dollar signs ('$') will be given no special meaning.
*
* @param s The string to be literalized
* @return A literal string replacement
* @since 1.5
*/
public static String quoteReplacement(String s) {
if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
return s;
StringBuffer sb = new StringBuffer();
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
if (c == '\\') {
sb.append('\\'); sb.append('\\');
} else if (c == '$') {
sb.append('\\'); sb.append('$');
} else {
sb.append(c);
}
}
return sb.toString();
}
中文解析
public static String
quoteReplacement
(String
s)
返回指定 String
的字面值替换 String
。 此方法将生成一个
String
,它将用作 Matcher
类的
appendReplacement
方法中的字面值替换 s
。所产生的 String
将与作为字面值序列的 s
中的字符序列匹配。斜线 ('\') 和美元符号 ('$') 将不具有任何特殊意义。
看到这里了我懂了, 你也懂的。
分享到:
相关推荐
最后,虽然原生JavaScript提供了很多处理字符串的工具和方法,但在开发过程中,理解这些方法的内部工作原理和它们的使用场景仍然非常重要。这能帮助开发者更有效地使用JavaScript编写代码,并在必要时做出最佳的实现...
Java中的`replace`、`replaceAll`和`replaceFirst`是字符串操作中常见的方法,用于替换字符串中的特定子串。它们都是`String`类的方法,但各自有不同的行为和用途。 1. `replace(CharSequence target, CharSequence...
"浅谈Java中replace与replaceAll区别" Java 中的字符串 replacement 是一个非常重要的知识点,今天我们就来探讨 Java 中的 replace 和 replaceAll 方法之间的区别。 首先, lets Talk about Java 中的 replace ...
在Java中,String类型提供了多种字符串替换方法,包括replace和replaceAll方法。replace方法用于将字符串中的某些字符替换为其他字符,例如: public static void main(String[] args) { String str = "aaa"; ...
如果不可用或不String.prototype.replaceAll调用其“ shim”方法对String.prototype.replaceAll进行填充。 该软件包实现了接口。 它在ES3支持的环境中工作,并符合。 最常见的用法: const assert = require ( '...
Java 中的 String 类提供了三种方法来实现字符串的替换,分别是 replace、replaceAll 和 replaceFirst。 1. replace 方法 replace 方法将字符串中所有出现的 oldChar 字符串替换为 newChar 字符串。如: String ...
本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组创建字符串。 - `String(String ...
因此,如果需要实现replaceAll效果,即替换字符串中所有匹配的子串,可以使用正则表达式配合replace()方法来实现。 正则表达式中的全局匹配标志(g)用于指示匹配操作应该在输入字符串中进行全局搜索,即查找到所有...
在Java编程语言中,`replace()` 和 `replaceAll()` 都是用来进行字符串替换的函数,但它们之间存在一些关键差异。 `replace()` 方法接受两个 `char` 类型的参数,一个是需要查找的字符,另一个是用于替换的字符。这...
在本案例中,我们关注的是它的一个功能——`ReplaceAll`,这是一个在字符串中执行全局替换操作的方法。 在PowerBuilder中,`ReplaceAll`函数通常用在`String`对象上,它的主要作用是查找字符串中的所有指定子串,并...
在JavaScript中,字符串对象有一个replace方法,该方法可以用来替换字符串中的某些特定子串。replace方法的基本用法是接受两个参数,第一个是正则表达式或者要替换的字符串,第二个是替换文本或者用于动态生成替换...
在Java编程语言中,`String` 类是处理字符串的核心类,它包含了大量的方法,使得对字符串的操作变得简单而高效。本篇文章将详细讲解`String`类的一些常用方法,并通过具体的例子来展示它们的用法。 1. **创建String...
以上只是`String`类众多方法中的一部分,实际开发中还有其他诸如`startsWith()`, `endsWith()`, `contains()`等方法,以及与`StringBuilder`和`StringBuffer`类配合使用的相关方法。理解和熟练掌握这些方法,能让你...
在本文中,我们将深入探讨`String`类的一些关键方法,这些方法在日常编程中极为常用,有助于字符串的处理和操作。 1. **构造方法**: - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组...
在 Java 中,String 类提供了许多常用的方法来处理字符串,这些方法可以帮助开发者更方便地操作字符串。下面是 String 类的一些常用方法: 1. length():返回字符串的长度 length() 方法返回字符串的长度,即字符...
这个测试涵盖了`String`类的一些关键方法,帮助我们更好地理解和使用这些方法来操作字符串。以下是一些`String`类中常见的方法及其用法: 1. **创建String对象** - `String str = "Hello World";`:直接初始化一个...
本文将深入探讨`String`类的使用,帮助你快速掌握其核心概念和常见方法。 首先,`String`类是不可变的。这意味着一旦创建了一个`String`对象,就不能改变它的值。这是因为`String`对象存储在常量池中,每次修改都会...
总之,Java中的String类提供了丰富的构造函数和方法,使得我们可以方便地创建、操作和比较字符串。理解并熟练运用这些方法对于进行Java编程,特别是在处理文本信息时,是非常关键的。在准备考试或实际工作中,掌握...
在这个总结中,我们将深入探讨String类的一些核心特性和方法。 首先,String类位于`java.lang`包中,这意味着它对所有Java程序都是自动导入的,无需额外引用。String类被声明为final,这意味着我们无法创建其子类,...