需要帮助解析Java中的字符串

时间:2010-09-01 00:48:18

标签: java string parsing

我正在阅读Java中的csv文件,并且根据给定行上字符串的格式,我必须做一些不同的事情。 csv文件中包含的三种不同格式是(使用随机数):

833 “79,869” “56-57,568”

如果它只是一个数字(833),我想将它添加到我的ArrayList中。如果它是由逗号分隔的两个数字并用引号括起来(“79,869”),我想解析出两个数字中的第一个(79)并将其添加到ArrayList中。如果它是由引号括起来的三个数字(前两个数字用短划线分隔,第三个用逗号[“56-57,568”]分隔,那么我想解析出第三个数字(568)并添加它到ArrayList。

我无法使用str.contains()来确定给定行上的字符串是否包含破折号。谁能给我一些帮助?以下是我到目前为止的情况:

private static void getFile(String filePath) throws java.io.IOException {
    BufferedReader reader = new BufferedReader(new FileReader(filePath));
    String str;

    while ((str = reader.readLine()) != null) {

        if(str.endsWith("\"")){
            if (str.contains(charDash)){
                System.out.println(str);
            }
        }

    }

}

谢谢!

6 个答案:

答案 0 :(得分:1)

我建议使用实际采用char而不是字符串的indexOf版本,因为这种方法要快得多。 (这是一个简单的循环,没有嵌套循环。)

  if (str.indexOf('-')!=-1) {
      System.out.println(str);
   }

(注意单引号,所以这是一个字符,而不是字符串。)

但是你必须拆分该行并解析各个值。目前,您正在测试整行是否以引号结束,这可能不是您想要的。

答案 1 :(得分:1)

以下代码适用于我(注意:我编写它时没有考虑优化 - 它仅用于测试目的):

public static void main(String args[]) {
    ArrayList<String> numbers = GetNumbers();
}

private static ArrayList<String> GetNumbers() {
    String str1 = "833";
    String str2 = "79, 869";
    String str3 = "56-57, 568";

    ArrayList<String> lines = new ArrayList<String>();

    lines.add(str1);
    lines.add(str2);
    lines.add(str3);

    ArrayList<String> numbers = new ArrayList<String>();

    for (Iterator<String> s = lines.iterator(); s.hasNext();) {
        String thisString = s.next();

        if (thisString.contains("-")) {
            numbers.add(thisString.substring(thisString.indexOf(",") + 2));
        } else if (thisString.contains(",")) {
            numbers.add(thisString.substring(0, thisString.indexOf(",")));
        } else {
            numbers.add(thisString);
        }
    }

    return numbers;
}

输出:

833
 79
568

答案 2 :(得分:1)

虽然这些天很讨厌,但我仍然非常喜欢StringTokenizer这种东西。您可以将其设置为返回令牌,至少对我来说,它使处理变得微不足道,而不与正则表达式进行交互

你必须使用“, - 作为你的代币来创建它,然后在循环中启动它。

st=new StringTokenizer(line, "\",-", true);

然后你设置一个循环:

while(st.hasNextToken()) {
    String token=st.nextToken();

每个案例都成为循环的一小部分:

// Use punctuation to set flags that tell you how to interpret the numbers.
if(token == "\"") {
    isQuoted = !isQuoted;
} else if(token == ",") {
    ...        
} else  if(...) {
    ...
} else { // The punctuation has been dealt with, must be a number group
    // Apply flags to determine how to parse this number.
}

我意识到StringTokenizer现在已经过时了,但我不确定为什么。解析正则表达式不能更快,语法是 - 分裂是一个非常甜蜜的语法,我必须承认。

我想如果你和你工作的每个人都对正则表达式非常熟悉,你可以用split替换它,只是迭代结果数组但是我不知道怎么分裂才能返回标点符号 - 可能就是这样“ +“来自其他答案的东西,但我从不相信我传递给正则表达式的某些角色不会做出完全出乎意料的事情。

答案 3 :(得分:0)

    if (str.indexOf(charDash.toString()) > -1){
        System.out.println(str);
    }

诀窍?

顺便说一句比contains快...因为它实现了indexOf

答案 4 :(得分:0)

这会有用吗?

if(str.contains("-")) {
    System.out.println(str);
} 

我想知道charDash变量是不是你期望的那样。

答案 5 :(得分:0)

我认为三个正则表达式是你最好的选择 - 因为有了一个匹配,你也得到了你感兴趣的一点。我吮吸正则表达式,但有些东西:

.*\-.*, (.+)

.*, (.+)

(.+)

应该这样做(按顺序,因为最终模式匹配包括前两个在内的任何东西)。