我有一个这样的字符串,我想删除所有包含数字的标记:
String[] s="In the 1980s".split(" ");
有没有办法删除包含数字的令牌 - 在这种情况下是1980s
,还有,例如784th
或s787
?
答案 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();