Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
任何字符上的Java字符串拆分(包括正则表达式特殊字符)_Java_String - Fatal编程技术网

任何字符上的Java字符串拆分(包括正则表达式特殊字符)

任何字符上的Java字符串拆分(包括正则表达式特殊字符),java,string,Java,String,我肯定我只是忽略了这里的一些东西 有没有一种简单的方法可以在不应用正则表达式规则的情况下拆分显式字符上的字符串 例如,我收到一个带有动态分隔符的字符串,我知道第5个字符定义了分隔符 String s = "This,is,a,sample"; 对于这一点,很容易做到 String delimiter = String.valueOf(s.charAt(4)); String[] result = s.split(delimiter); 但是,当我有一个分隔符是一个特殊的正则表达式字符时,这不

我肯定我只是忽略了这里的一些东西

有没有一种简单的方法可以在不应用正则表达式规则的情况下拆分显式字符上的字符串

例如,我收到一个带有动态分隔符的字符串,我知道第5个字符定义了分隔符

String s = "This,is,a,sample";
对于这一点,很容易做到

String delimiter = String.valueOf(s.charAt(4));
String[] result = s.split(delimiter);
但是,当我有一个分隔符是一个特殊的正则表达式字符时,这不起作用:

String s = "This*is*a*sample";

所以。。。有没有一种方法可以在不应用额外的正则表达式规则的情况下拆分显式字符上的字符串?我觉得我一定错过了一些非常简单的东西。

如果使用
模式,就不必担心字符类型

Pattern regex = Pattern.compile(s.charAt(4));
Matcher matcher = regex.matcher(yourString);
if (matcher.find()){
    //do something
}
使用正则表达式作为其参数
*
是一个元字符,用于匹配正则表达式中的零个字符,您可以使用它来避免解释字符

String[] result = s.split(Pattern.quote(delimiter));
您可以在输入分隔符之前运行它。这将创建字符串文字并转义任何特定于正则表达式的字符:

delimiter = Pattern.quote(delimiter);
StringUtils.split(s,分隔符)

这将把分隔符视为一个字符,而不是像正则表达式那样使用它


StringUtils
ApacheCommons
库的一部分,其中包含大量有用的方法。它值得一看,可以在将来为您节省一些时间。

只需将您的分隔符放在[]

String delimiter = "["+s.charAt(4)+"]";
String[] result = s.split(delimiter);

因为[]是正则表达式,所以它匹配[]之间的任何字符。您还可以指定一个分隔符列表,如[*,.+-]

转义正则表达式字符。如前所述,使用
模式。引号(分隔符)
。这是喜欢Guava拆分器的原因之一。很好,我知道我缺少一些简单的东西,只是不知道正确的搜索词。谢谢在google中找到这个答案的人需要注意的一点是:
split
最常见的实现是显式检查反斜杠+字符分隔符,这些分隔符在正则表达式中没有特殊意义,并运行快速本地循环,而不是使用完整的
模式
引擎。通过使用
\Q..\E
(quote()
正在执行的操作)包围角色,分隔符将不再触发快速路径,而是在每次调用时创建一个新的模式对象。所以,对你的代码进行基准测试,看看这个速度是否有所不同,并且如果它确实考虑仔细地避开字符。