我从网页上得到一个大字符串,就像这样
"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。任何人都知道如何解决这个问题?
答案 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 "