将String.split()与多个定界符一起使用


201

我需要基于定界符-和分割字符串.。以下是我想要的输出。

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

但我的以下代码不起作用。

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

根据您所说的,看来一切正常。您想要的输出是什么?
杰夫,

2
@Jeff:他展示了他想要的输出(AA/ BB/ CC...)
TJ Crowder

2
你确定吗?我将其解释为他当前的输出,而不是他期望的输出。也许是时候站起来四处走走了。
杰夫,

@Jeff:抱歉让您感到困惑,我更新了我的帖子以消除您的误解。
唐潘

正则表达式会降低您的性能。我建议写一个方法,如果需要的话,将一个字符一个字符地分割字符串。您可以进一步优化以获得log(n)性能。
Princesh

Answers:


311

我认为您需要包括regex OR运算符

String[]tokens = pdfName.split("-|\\.");

您将匹配的内容:
[DASH之后再加上DOT],-.
而不是
[其中的DASH或DOT] -.


9
为什么我们需要两个反斜线?
pjain '16

7
.正则表达式中的字符表示换行符以外的任何其他字符。tutorialspoint.com/java/java_regular_expressions.htm但是,在这种情况下,他们需要实际的字符.。两个反斜杠表示您所指的是.。反斜杠是转义字符。
Monkeygrinder '16

2
正常情况下,这将是.split("match1|match2"),(例如split("https|http"),\\是逃避特殊字符).在上述情况下
prayagupd

或通常,您可以使用pdfName.split("\\W");以下@Peter Knego答案
ahmednabil88 '19

1
使用[-.]代替-|\\.
赛义德

49

试试这个正则表达式"[-.]+"。+之后将连续的定界符char视为1。如果您不希望这样做,请删除加号。


8
@Lurkers:Peter不必逃避的唯一原因-是,它是内的第一个想法[],否则它前面必须有一个反斜杠(当然,要在它前面加上一个反斜杠,我们需要两个,因为这是字符串文字)。
TJ Crowder

我认为这个答案比公认的答案更好,因为当您使用逻辑运算符|时,问题是您的分隔符之一可能成为结果“令牌”的一部分。彼得·克尼戈(Peter Knego)的[-。] +
杰克(Jack)

26

您可以使用正则表达式“ \ W”。它与任何非单词字符匹配。所需的行为:

String[] tokens=pdfName.split("\\W");

它对我不起作用`String s =“ id(INT),name(STRING),”。在此处使用\\ W创建一个长度为6的数组,该数组应仅为4
user352797515

2
当输入包含Unicode字符时,这也会中断。最好只包含实际的定界符,而不要使用\W
nhahtdh

13

您提供split的字符串是正则表达式的字符串形式,因此:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

这意味着要分割中的任何字符[](我们必须-用反斜杠转义,因为它在内部是特殊的[];当然,我们必须转义反斜杠,因为这是一个字符串)。(相反,.通常是特殊的,但在内部不是特殊的[]。)


在这种情况下,您无需转义连字符,因为[-.]不可能将其解释为范围。
艾伦·摩尔

1
@Alan:因为这是班上第一件事,所以这是真的。但是我总是这样做,以后再回去并在其前面添加一些内容而不用思考就太容易了。逃脱不需任何费用,所以……
TJ Crowder

你知道如何逃脱括号吗?我想将字符串“ [200]工程”拆分为“ 200”,“工程”
scottysseus 2013年

3
哦,我知道了...我必须使用两个反斜杠而不是一个。String[] strings = codes.get(x).split("\\[|\\]| ");<-感兴趣的代码
scottysseus

13

使用番石榴,您可以这样做:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

4

对于两个字符序列作为分隔符“ AND”和“ OR”,应进行此操作。使用时不要忘记修剪。

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

结果:城市= {“伊斯坦布尔”,“纽约”,“巴黎”,“东京”,“莫斯科”}


如何获得类似{“ ISANDBUL AND”,“纽约AND”,“巴黎OR”,“东京AND”,“莫斯科”}这样的输出
Ahamadullah Saikat

3

我会使用Apache Commons:

进口 org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

它将在任何指定的分隔符上进行分割,与之相对的是,StringUtils.splitByWholeSeparator(str, separator)它使用完整的字符串作为分隔符


3
String[] token=s.split("[.-]");

9
请通过添加一些解释来补充纯代码答案,以帮助消除对StackOverflow是一项免费代码编写服务的误解。
Yunnosch

2

最好使用这样的东西:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

添加了其他一些字符作为示例。这是使用最安全的方式,因为这样.'进行处理。



1

试试这个代码:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

1
请通过添加一些解释来补充纯代码答案,以帮助消除对StackOverflow是一项免费代码编写服务的误解。
Yunnosch

0
s.trim().split("[\\W]+") 

应该管用。


2
首先,不,它不起作用-也许您可以在发布之前尝试一下?然后,此答案与您的答案相同-但有效。最后,您应该检查格式(应该可以使用)。
Arount

1
请通过添加一些解释来补充纯代码答案,以帮助消除对StackOverflow是一项免费代码编写服务的误解。
Yunnosch

-1

如果您知道字符串将始终采用相同的格式,请首先基于分割字符串,.然后将字符串存储在变量的第一个索引处。然后,基于第二个索引拆分字符串,-并存储索引0、1和2。最后,基于拆分前一个数组的索引2,.您应该已经获得了所有相关字段。

请参考以下代码段:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
它可以一步完成,因此只需一步。查看其他回复。
Kaj

2
pdfName.split(".")导致长度为零的数组。
艾伦·摩尔

1) .需要逃脱,因为\\.
Shri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.