2

我有一个使用管道符号“| 作为分隔符的字符串。但是,字符串数据也包含管道符号。有没有办法忽略这个?

例子:

name|address|age

John|123 Wood Road|Street, London|25

因此,当我这样做时 -

text.split("\\|")

给我:

John

123 Wood Road

Street, London

25

我期待这个:

John

123 Wood Road|Street, London

25
4

6 回答 6

6

String.split()无法区分同一符号的不同出现。您必须在代码或正则表达式中制定一些规则。根据您的数据,我猜测虽然您说管道可以出现在字符串数据中,但它确实不能出现在名称或年龄中,因此您可以执行以下操作:

String[] results = text.split("\\|")

String name = results[0];
String age = results[results.length - 1]

String address = results[1];
for (int i = 2; i < results.length-1; i++) {
    address = address + "|" + results[i];
}
于 2012-06-14T20:26:44.833 回答
1

但是,字符串数据也包含管道符号。有没有办法忽略这个?

这是错误的解决方法。

如果用户输入姓名、地址和年龄,您应该在存储之前对其进行消毒

那么在这种情况下,您将如何清理用户输入。好吧,您通常会使用反斜杠(在连接最终字符串之前)转义任何用户输入的管道字符,而不是存储

John|123 Wood Road|Street, London|25

你会存储

John|123 Wood Road\|Street, London|25

这样,您始终可以通过以下方式取回用户输入的内容

  1. 拆分未转义的管道字符
  2. 解开每一部分。

但是,我鼓励您为此使用库,例如​​ OpenCSV。

于 2012-06-14T20:25:32.873 回答
1

简单的答案是使用不同的分隔符。

尽管这不是万无一失的,因为您可能会在您的某个部分(姓名、地址或年龄)中遇到新的分隔符作为有效字符。

我更好的建议是加入某种转义字符,以便在遇到管道时不将管道视为定界管道。(也许是\???)

我想您熟悉转义字符的概念,因为您在提供给String.split().

“约翰|伍德路 123 号\|伦敦街|25”

于 2012-06-14T20:28:03.140 回答
1

这是你想要的?

String text = "John|123 Wood Road|Street, London|25";

int first = text.indexOf("|");
int last = text.lastIndexOf("|");

String name = text.substring(0, first);
String age = text.substring(last + 1);
String address = text.substring(first + 1, last);

System.out.println(name);
System.out.println(address);
System.out.println(age);

输出:

John
123 Wood Road|Street, London
25

更通用的解决方案:

public static void main(String[] args)
{
    String text = "John|123 Wood Road|Street, London|25";
    for(String s : getArray(text, 0, 1, 0)) System.out.println(s);
}

public static String[] getArray(String text, int... pipeCount)
{
    String[] arr = text.split("\\|");
    String[] result = new String[3];

    int counter = 0;
    for(int i = 0; i < result.length; i++)
    {
        result[i] = "";
        for(int j = 0; j <= pipeCount[i]; j++) result[i] += arr[counter++];
    }
    return result;
}

输出:

John
123 Wood Road|Street, London
25
于 2012-06-14T20:28:05.387 回答
1
  • 通常,您不能将任何属于数据的一部分作为分隔符。如果它们是相同的字符,如何区分分隔符和数据?解决这个问题的方法是使用一些不常见的作为分隔符,如双管道||或其他不太可能出现在数据中的模式。
  • 如果可能,您可以使用其他数据格式,如 XML、JSON、CSV 等。这比前一种解决方案要好得多,因为它总是有效的。
  • 在这种特殊情况下,如果您确定只有地址可以包含|但名称和年龄不能包含|,那么您可以使用 拆分|,将第一个作为名称,将最后一个作为年龄,并将它们之间的所有部分作为地址。如果它们之间有多个部分,则地址包含|. |然后,您可以在知道它们是地址的一部分的情况下加入中间部分。但这不是一个好的解决方案,因为如果|在第一个和最后一个字段中允许,这将不起作用。
于 2012-06-14T20:28:07.133 回答
1

您可以通过某种方式转义用户输入。例如,如果|是您的分隔符,并且您的数据包含一个分隔符,请将其更改为%p(p 表示管道!)。但是你也必须逃避 all %。在序列化数据时执行此操作,然后在反序列化时撤消它。

于 2012-06-14T20:42:19.263 回答