如何解决String.split*不是*在正则表达式上?
| 由于String.split()
适用于正则表达式,因此此代码段:
String s = \"str?str?argh\";
s.split(\"r?\");
...产量::2ѭ
在r?
序列上拆分此String以使其产生[st,st,argh]
的最优雅方法是什么?
编辑:我知道我可以摆脱有问题的?
。麻烦是我不知道定界符是什么,而且我不想编写escapeGenericRegex()
函数来解决这个问题。
解决方法
仅使用Java SE API的一般解决方案是:
String separator = ...
s.split(Pattern.quote(separator));
quote
方法返回一个正则表达式,它将与参数字符串作为文字匹配。
, 您可以使用
StringUtils.split(\"?r\")
来自commons-lang。
, 转义?
:
s.split(\"r\\\\?\");
, String[] strs = str.split(Pattern.quote(\"r?\"));
, 这也很完美:
public static List<String> splitNonRegex(String input,String delim)
{
List<String> l = new ArrayList<String>();
int offset = 0;
while (true)
{
int index = input.indexOf(delim,offset);
if (index == -1)
{
l.add(input.substring(offset));
return l;
} else
{
l.add(input.substring(offset,index));
offset = (index + delim.length());
}
}
}
, 使用番石榴分配器:
通常通过识别分隔符序列的出现,从输入字符串中提取不重叠的子字符串。该分隔符可以指定为单个字符,固定字符串,正则表达式或CharMatcher实例。或者,完全不用分隔符,分隔符可以提取给定固定长度的相邻子字符串。
, 直接使用Pattern类,可以将表达式定义为LITERAL,在这种情况下,将按原样对表达式进行求值(而不是regex表达式)。
Pattern.compile(<literalExpression>,Pattern.LITERAL).split(<stringToBeSplitted>);
例:
String[] splittedResult = Pattern.compile(\"r?\",Pattern.LITERAL).split(\"str?str?argh\");
将导致:
[st,st,argh]
, 尝试
String s = \"str?str?argh\";
s.split(\"r\\?\");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。