Java 按照空格和特殊字符分割字符串

8

我将尝试在空格和一些特殊字符上分割字符串。

给定字符串 "john - & + $ ? . @ boy",我想要得到数组:

array[0]="john";
array[1]="boy";

我尝试了几个正则表达式,但都没有得到结果。这是我当前的尝试:

String[] terms = uglString.split("\\s+|[\\-\\+\\$\\?\\.@&].*");

保留“john”但不保留“boy”。有人可以帮我找出剩下的内容吗?

1
我认为了解每个数组值中应允许的字符是很重要的;否则,你的问题就会变得非常开放和模糊。 - tenub
这就是问题所在,我还不知道它们全部是什么。 - Jeremiah Adams
请查看此链接:http://www.vogella.com/tutorials/JavaRegularExpressions/article.html 并在此处测试:http://www.regexe.com/ - z atef
7个回答

12

只需使用:

String[] terms = input.split("[\\s@&.?$+-]+");

你可以在字符类中使用简写字符类(注意 \s),大多数元字符在字符类中失去了它们的意义,除了 []-&\。然而,只有当 && 成对出现时,& 才有意义,如果把 - 放在字符类的开头或结尾,则被视为普通字符。

其他语言可能有不同的模式解析规则,但关于 - 的规则适用于大多数引擎。

正如 @Sean Patrick Floyd 在他的回答中提到的那样,重要的是定义什么构成一个单词。Java 中的 \w 相当于 [a-zA-Z0-9_](英文字母大写和小写、数字和下划线),因此,\W 包括所有其他字符。如果您想考虑 Unicode 字母和数字,可以看一下Unicode 字符类


9
你可以通过将模式替换为"\\W+"(一个或多个非单词字符的出现)来使你的代码更简单。(这样你就是在列出允许的字符,而不是列出禁止的字符,这通常是个好主意)。当然,你还可以使用Guava的Splitter来提高效率。

2
最初的回答:尝试使用以下代码......
Input.replace("-&+$?.@"," ").split(" ");

1

分步骤解释:

对于您的情况,您需要替换非单词字符(如所指出的)。现在您可能想保留空格以便进行简单的字符串拆分。

String ugly = "john - & + $ ? . @ boy";
String words = ugly.replaceAll("[^\\w\\s]", "");

生成的字符串中有很多空格,您可能希望将其整体修剪为只有一个空格:
String formatted = words.trim().replaceAll(" +", " ");

现在,您可以将字符串轻松拆分为单词并转换为字符串数组:
String[] terms = formatted.split("\\s");
System.out.println(terms[0]);

0
请使用这个格式:

这里是内容。

String s = "john - & + $ ? . @ boy";
String reg = "[!_.',@? ]";
String[] res = s.split(reg);

[ ] 括号内包含您想要拆分的每个字符。


0

关于Splitter,你可以这样做:

    String str = "john - & + $ ? . @ boy";
    Iterable<String> ttt = Splitter.on(Pattern.compile("\\W")).trimResults().omitEmptyStrings().split(str);

\s\W 相当于 \W。单词字符类不包含空格,因此非单词字符类包含空格。 - nhahtdh

-1
你可以使用类似以下的方式:
arrayOfStringType=string.split(" |'|,|.|//+|_");

'|' 在这里将作为或运算符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接