分号分割的字符串拆分

9
我想通过分号(";")来拆分字符串:
String phrase = "‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid";
String[] dateSplit = phrase.split(";");
System.out.println("dateSplit[0]:" + dateSplit[0]);
System.out.println("dateSplit[1]:" + dateSplit[1]);

但是它会从字符串中删除 ";" 并将所有字符串放到 'datesplit1' 中,因此输出结果为:
dateSplit[0]:‫
dateSplit[1]:‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid`

演示

在执行时

System.out.println("Real String :"+phrase);

打印的字符串是

Real String :‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid

11
你的“phrase”变量格式不正确。请展示实际代码,这样我们或许可以提供帮助。 - vdwijngaert
2
我感觉这里可能存在编码问题。 - Palcente
2
@s_puria 没门,这甚至都无法编译。 - Maroun
2
当我在我的系统上复制了你的代码时,它被复制成了这样 ‪String phrase = ";14/May/2015‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid"; - Naman Gala
2
在UTF-8中,此字符串看起来像这样: "?;?2015年5月14日?? ??FC?? ??巴塞罗那?? ??VS.?? ??皇家马德里" - Palcente
显示剩余12条评论
3个回答

11

短语包含双向字符,如从右到左嵌入。这就是为什么一些编辑器不能正确显示字符串的原因。

这段代码显示了String中实际的字符(对于一些人来说,短语可能无法正确地显示,但在Eclipse中编译并且看起来正常)。我将从左到右翻译成->,将从右到左翻译成<-,并将流动方向翻译成^

public static void main(String[]args) {
    String phrase = "‫;‪14/May/2015‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid";
    String[] dateSplit = phrase.split(";");
    for (String d : dateSplit) {
        System.out.println(d);
    }
    char[] c = phrase.toCharArray();
    StringBuilder p = new StringBuilder();
    for (int i = 0; i < c.length;i++) {
        int code = Character.codePointAt(c, i);
        switch (code) {
        case 8234:
            p.append(" -> ");
            break;
        case 8235:
            p.append(" <- ");
            break;
        case 8236:
            p.append(" ^ ");
            break;
        default:
            p.append(c[i]);
        }
    }
    System.out.println(p.toString());
}

输出:

<- ; -> 2015年5月14日 ^ ^ <- -> FC ^ ^ <- -> Barcelona ^ ^ <- -> VS. ^ ^ <- -> Real ^ ^ <- -> Madrid

String#split() 方法作用于实际的字符串而非编辑器显示的内容。因此,你可以看到分号 ; 是从从右到左的第二个字符,这是由于混杂了从左到右排列的足球队名所致。请注意,分号 ;dateSplit[1] 中不是字符串的一部分,所以要小心处理。

dateSplit[0] = "";
dateSplit[1] = "2015年5月14日 ‬‬ ‫‪FC‬‬ ‫‪Barcelona‬‬ ‫‪VS.‬‬ ‫‪Real‬‬ ‫‪Madrid;;

我猜你正在处理从右到左书写/阅读的语言中的数据,并且与从左到右的足球队名混合在一起。解决方案是摆脱定向字符并将分号 ; 放在正确位置,即作为标记的分隔符。


1

我重新编写了你的代码,而不是从这里复制,现在它完美地运行。

public static void main(String[] args) {
    String phrase = "14/May/2015; FC Barcelona VS. Real Madrid";
    String[] dateSplit = phrase.split(";");
    System.out.println("dateSplit[0]:" + dateSplit[0]);
    System.out.println("dateSplit[1]:" + dateSplit[1]);
}

演示


1
这是OP发布的字符串 - Palcente
1
该字符串中有一些隐藏字符,这是发帖者发布时出现的。 - Prashant
@Palcente,哦,我明白了,我以为OP正在尝试使用问题中可见的这个文本。 - Naman Gala
@s_puria,这是你想要的吗?还是有一些隐藏的字符? - Naman Gala
有一些隐藏的字符。 - s_puria
我的代码中有一些隐藏字符,我认为它们是RTL方向的,但显示却是LTR方向的。 - s_puria

0
将您的代码剪切并粘贴到IntelliJ中会损坏编辑器;正如@Palcente所说,可能存在编码问题。
然而,我建议使用StringTokenizer代替。
StringTokenizer sTok = new StringTokenizer(phrase, ";");

然后您可以对其进行迭代,这将导致更好(和更安全)的代码。


2
你说:“然而,我建议使用StringTokenizer。这样你可以迭代它,从而得到更好(和更安全)的代码。” JavaDoc说:“StringTokenizer是一个遗留类,为了兼容性而保留,尽管在新代码中不鼓励使用。建议任何寻求此功能的人改用String的split方法或java.util.regex包。”那么一个新手应该怎么想? :P - Tom
@Tom 嗯,我没有注意到这一点,可能是因为它还没有被注释为已弃用(而且,我已经记不清上一次我实际使用StringTokenizer是什么时候了)。好知道。 - Steve Chaloner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接