java将字符添加到字符串中

时间:2011-12-02 17:13:17

标签: java string

我从网页上得到一个大字符串,就像这样

"07:10Ο ΑΣΔΦΑΣΔΦ07:30ΑΣΔΦΑΣΔΦ10:15ΝΑΣΔΦΑΣΔΦ"

我希望每当我找到像这个“17:50”或“07:30”这样的时间来获得新的时间线之前!所以我会

07:10   ΑΣΔΦΑΣΔΦ
07:30   ΑΣΔΦΑΣΔΦ
10:15   ΝΑΣΔΦΑΣΔΦ

等...

但这是我的问题,我试图用这个

来拼写字母
StringBuilder builder = new StringBuilder(text);
for (int i = 0; i < text.length(); i++) {
     if(Character.isDigit(text.charAt(i))){
            builder.insert(i, "\n");
     }
}

但在我的文字中我有希腊字母,所以当得到一些希腊字母时,isDigit返回1。任何人都知道如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

为了提供一些初步帮助,builder.insert()行没有做你想要的事情:

StringBuilder builder = new StringBuilder(text);
for (int i = 0; i < text.length(); i++) {
     if(Character.isDigit(text.charAt(i))){
            builder.insert(i, "\n"); // questionable
     }
}

对于字符串“12:45”,你真的想要`\ n1 \ n2:\ n4 \ n5“吗?

你可能只想匹配"\\d\\d[:.]\\d\\d"并在每场比赛前加上“\ n”postpend“”,但我不能确定我理解你的问题。

具体来说,我刚试过:

String str = "07:10Ο Σκούμπι Ντου & ο κολλητός του07:30Πρωϊνή μελέτη10:15Νηστικοί πράκτορες11:15Σαρίτα, είσαι η ζωή μου12:50Οι ειδήσεις του Star13:45Made in Star15:45Μίλα17:45Ειδήσεις17:50Φώτης - Μαρία live19:45Οι ειδήσεις του Star21:00Ο Χαρί Πότερ και ο ημίαιμος πρίγκιψ00:15Σχολή για απατεώνες01:15Supernatural02:15Gypsy woman02:30Τα πλοκάμια του τρόμου03:45Ραπ πάρτι04:30The Dead zone";
return str.replaceAll("(\\d\\d[:.]\\d\\d)", "\n$1 ");

这是否按您想要的方式工作?我的终端似乎不太支持这些字符,所以我可能有一个语言环境编码问题。

答案 1 :(得分:1)

问题不在于isDigit检测,问题是builder.insert(i, "\n");

试试这个,它没有insert

@org.junit.Test
public void endodingTest() {
    String text = "07:10Ο Σκούμπι Ντου & ο κολλητός....";
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < text.length(); i++) {
         char c = text.charAt(i);
         if(Character.isDigit(c)) {
             builder.append("\n");
         }
         builder.append(c);

    }
    System.out.println(builder.toString());
}

问题是,每次在“字符串”构建器中插入其他\n时,该换行符后面的每个字符都会向后移动一个字符。要更正此问题,您必须计算已插入的所有换行符,如果插入新换行符,则必须将其插入位置i + numberOfAlreadyInsertedLineBreaks

builder.insert(i + numberOfAlreadyInsertedLineBreaks, "\n");) 下面的完整示例)


当然第二件事(但你已经知道了)是你必须改进你的模式,所以最后这是灵魂

@org.junit.Test
public void endodingTest() {
    String text = "07:10Ο Σκούμπι Ντου & ο κολλητός του07:30Πρωϊνή μελέτη10:15Νηστικοί πράκτορες11:15Σαρίτα, είσαι η ζωή μου12:50Οι ειδήσεις του Star13:45Made in Star15:45Μίλα17:45Ειδήσεις17:50Φώτης - Μαρία live19:45Οι ειδήσεις του Star21:00Ο Χαρί Πότερ και ο ημίαιμος πρίγκιψ00:15Σχολή για απατεώνες01:15Supernatural";
    StringBuilder builder = new StringBuilder(text);
    int numberOfAlreadyInsertedLineBreaks = 0;
    for (int i = 0; i < text.length(); i++) {

        if (match(text, i)) {
            builder.insert(i + numberOfAlreadyInsertedLineBreaks, '\n');
            numberOfAlreadyInsertedLineBreaks++;
        }

    }
    System.out.println(builder.toString());
}

private boolean match(String text, int i) {
    return Character.isDigit(text.charAt(i))
            && Character.isDigit(text.charAt(i + 1))
            && text.charAt(i + 2) == ':'
            && Character.isDigit(text.charAt(i + 3))
            && Character.isDigit(text.charAt(i + 4));
}

答案 2 :(得分:0)

首先,我担心你错了。我从维基百科那里拿了希腊ABC,并在其上运行了以下循环:

public static void main(String[] args) {
    System.out.println("before");
    String greek = "ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω";
    for (char c : greek.toCharArray()) {
        if (Character.isDigit(c)) {
            System.out.println("digit is found: " + c);
        }
    }
    System.out.println("after");
}

打印出来:

before
after

这意味着isDigit()正常工作。

关于从字符串中提取时间。我建议你使用以下正则表达式:

    Pattern p = Pattern.compile("(\\d{2}:\\d{2})");
    Matcher m = p.matcher(str);
    int start = 0;
    while(m.find(start)) {
        String time = m.group(1);
        start = m.end();
                // time variable contain time HH:mm. Just use it as you need
    }

答案 3 :(得分:0)

尝试Pattern

scala> java.util.regex.Pattern.compile("(\\d\\d.\\d\\d)").matcher("first12.34second56.78third90.12fourth34.56").replaceAll("$1 ")
res1: java.lang.String = "first12.34 second56.78 third90.12 fourth34.56 "


scala> java.util.regex.Pattern.compile("(\\d\\d.\\d\\d)").matcher("αβγδεζηθικλ12.34αβγδεζηθικλ56.78αβγδεζηθικλ90.12αβγδεζηθικλ34.56").replaceAll("$1 ")
res2: java.lang.String = "αβγδεζηθικλ12.34 αβγδεζηθικλ56.78 αβγδεζηθικλ90.12 αβγδεζηθικλ34.56 "