2

我在玩UVa #494,我设法用下面的代码解决了它:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main {    
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = in.readLine()) != null){
            String words[] = line.split("[^a-zA-z]+");
            int cnt = words.length;
            // for some reason it is counting two words for 234234ddfdfd and words[0] is empty
            if(cnt != 0 && words[0].isEmpty()) cnt--; // ugly fix, if has words and the first is empty, reduce one word
            System.out.println(cnt);
        }
        System.exit(0);
    }
}

我构建了正则表达式"[^a-zA-z]+"来拆分单词,例如字符串abc..abcabc432abc应该拆分为["abc", "abc"]. 但是,当我尝试使用 string 时432abc,结果是["", "abc"]- 第一个元素 fromwords[]只是一个空字符串,但我希望只有["abc"]. 我不明白为什么这个正则表达式给了我""这个案例的第一个元素。

4

2 回答 2

8

查看拆分参考页面:拆分参考

分隔符的每个元素定义一个单独的分隔符。如果两个分隔符相邻,或者在该实例的开头或结尾找到分隔符,则对应的数组元素包含 Empty。下表提供了示例。

由于您有几个连续的分隔符,因此您会得到空数组元素

于 2012-12-29T06:33:57.293 回答
3

打印字数

public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            Pattern pattern = Pattern.compile("[a-zA-z]+");
            Matcher matcher = pattern.matcher(line);
            int count = 0;
            while (matcher.find()) {
                count++;
                System.out.println(matcher.group());
            }
            System.out.println(count);
        }
    }
于 2012-12-29T06:59:38.447 回答