Java String删除标记包含数字

时间:2014-11-17 15:02:10

标签: java string token tokenize stringtokenizer

我有一个这样的字符串,我想删除所有包含数字的标记:

 String[] s="In the 1980s".split(" ");

有没有办法删除包含数字的令牌 - 在这种情况下是1980s,还有,例如784ths787

4 个答案:

答案 0 :(得分:1)

使用\w*\d\w*正则表达式匹配器。它将匹配其中至少有一位数的所有单词。虽然我一般都鄙视正则表达式,但它们特别适合你的问题。

String[] s = input.replaceAll("\\w*\\d\\w* *", "").split(" +");

有关如何使用正则表达式的更多参考,请参阅Java lib docs for Pattern/Matcher (RegEx)

测试代码: http://ideone.com/LrHDsT

答案 1 :(得分:1)

首先删除不需要的单词,然后拆分:

String[] s = str.replaceAll("\\w*\\d\\w*", "").trim().split(" +");

一些测试代码:

String str = "666 In the 1980s 784th s787 foo BAR";
String[] s = str.replaceAll("\\w*\\d\\w*", "").trim().split(" +");
System.out.println(Arrays.toString(s));

输出:

[In, the, foo, BAR]

答案 2 :(得分:0)

你可以按照@vaxquis的建议使用正则表达式,或者在根据分隔符拆分字符串之后交替使用

您可以解析令牌字符串并使用NumberUtils.isNumber检查令牌中是否有数字并删除这些令牌。

答案 3 :(得分:0)

split似乎不是您想要的。即使你删除包含数字的单词,如

"1foo f2oo bar whatever baz2"

你最终会

"  bar whatever " 

如果您现在拆分空格,最终会得到["", "bar", "whatever"]

要解决此问题,您可能还需要在删除之后删除空格,以便

"1foo f2oo bar whatever baz2"

会变成

"bar whatever "

所以可以正确拆分(最后的空格不是问题,因为split默认删除结果数组中的尾随空字符串。)


但是,不是进行两次迭代(删除单词并在字符串上拆分),而只需一次迭代即可实现相同的功能。你需要做的就是采用相反的方法:不要只关注去除错误的元素,试着找到正确的元素 正确的标记似乎是包含任何非空格字符但不包含数字的单词。您可以使用此正则表达式\b[\S&&\D]\b表示此类单词的正则表达式,其中:

  • \b代表字边界,
  • \S任何非空白字符
  • \D任何非数字字符
  • [\S&&\D]非空格和非数字的交集,换句话说非空格也是非ditigts

演示:

String input = "1foo f2oo bar whatever baz2";
Pattern p = Pattern.compile("\\b[\\S&&\\D]+\\b");
Matcher m = p.matcher(input);
while(m.find())
    System.out.println(m.group());

输出:

bar
whatever

BTW为了避免在结果开始时潜在的空元素的潜在问题,你可以使用Scanner如果在字符串的开头找到分隔符则不会返回空元素。所以我们可以简单地将分隔符设置为一系列空格或包含数字的单词。所以你的代码看起来也像

Scanner sc = new Scanner(input);
sc.useDelimiter("(\\s|\\w*\\d\\w*)+");
while (sc.hasNext())
    System.out.println(sc.next());
sc.close();