Java的字符串拆分(regex)函数在正则表达式的所有实例中拆分。 Python的分区函数仅在给定分隔符的第一个实例处拆分,并返回{left,separator,right}的元组。
如何实现Java中的分区功能?
e.g。
"foo bar hello world".partition(" ")
应该成为
"foo", " ", "bar hello world"
是否有外部库 是否已提供此实用程序?
如果没有,我将如何实现它 外部图书馆?
如果没有外部库且没有Regex,可以实现吗?
NB。我不是在寻找split(“”,2),因为它不会返回分隔符。
答案 0 :(得分:5)
虽然不是完全你想要的东西,但是second version of split有一个“限制”参数,告诉它将字符串拆分成的最大分区数。
所以如果你打电话(用Java):
"foo bar hello world".split(" ", 2);
你得到阵列:
["foo", "bar hello world"]
这或多或少是你想要的,除了分隔符没有嵌入索引1的事实。如果真的需要这最后一点,你需要这样做你自己,但希望你特别想要的就是限制分裂数量的能力。
答案 1 :(得分:5)
String.split(String regex, int limit)
接近你想要的。来自文档:
limit
参数控制模式的应用次数,因此会影响结果数组的长度。
- 如果限制
n
大于零,那么模式将最多应用n - 1
次,数组的长度不会超过n
,并且数组的最后一个条目将包含超出最后匹配分隔符的所有输入。- 如果
n
是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度。
- 如果
n
为零,则模式将被应用尽可能多次,数组可以具有任意长度,尾随空字符串将被丢弃。
以下是展示这些差异的示例(as seen on ideone.com):
static void dump(String[] ss) {
for (String s: ss) {
System.out.print("[" + s + "]");
}
System.out.println();
}
public static void main(String[] args) {
String text = "a-b-c-d---";
dump(text.split("-"));
// prints "[a][b][c][d]"
dump(text.split("-", 2));
// prints "[a][b-c-d---]"
dump(text.split("-", -1));
// [a][b][c][d][][][]
}
如果您需要与分区类似的功能,并且您还希望获得与任意模式匹配的分隔符字符串,则可以使用Matcher
,然后在适当的索引处使用substring
。
以下是一个示例(as seen on ideone.com):
static String[] partition(String s, String regex) {
Matcher m = Pattern.compile(regex).matcher(s);
if (m.find()) {
return new String[] {
s.substring(0, m.start()),
m.group(),
s.substring(m.end()),
};
} else {
throw new NoSuchElementException("Can't partition!");
}
}
public static void main(String[] args) {
dump(partition("james007bond111", "\\d+"));
// prints "[james][007][bond111]"
}
正则表达式\d+
当然是重复一次或多次(\d
)的任何数字字符(+
)。
答案 2 :(得分:2)
这个怎么样:
String partition(String string, String separator) {
String[] parts = string.split(separator, 2);
return new String[] {parts[0], separator, parts[1]};
}
顺便说一下,你必须在此处添加一些输入/结果检查:)
答案 3 :(得分:0)
使用:
"foo bar hello world".split(" ",2)
默认情况下,分隔符是空格
答案 4 :(得分:0)
是否有外部库提供此实用程序?
我不知道。
如果没有外部库,我将如何实现它? 如果没有外部库并且没有正则表达式,它可以实现吗?
当然,这根本不是问题;只需使用String.indexOf()
和String.substring()
。但是,Java没有元组数据类型,因此您必须返回一个数组,List或编写自己的结果类。