Java - 在String中忽略分隔符

时间:2012-06-14 20:19:27

标签: java

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

示例:

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

6 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:1)

  

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

这是解决它的错误方法。

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

那么在这种情况下你将如何消毒用户输入?好吧,您通常会使用反斜杠(在连接最终字符串之前)转义任何用户输入的管道字符,因此不要存储

John|123 Wood Road|Street, London|25

你会存储

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

通过这种方式,您可以随时通过

取回用户输入的内容
  1. 拆分未转义的管道字符
  2. 取消每个部分。
  3. 但我鼓励您使用此库,例如OpenCSV。

答案 2 :(得分:1)

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

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

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

我认为您熟悉转义字符的概念,因为您在String.split()提供的正则表达式中使用它们。

  

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

答案 3 :(得分: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

答案 4 :(得分:1)

  • 通常,您不能将任何属于数据的内容作为分隔符。如果分隔符是相同的字符,如何区分分隔符?解决这个问题的方法是使用一些不常见的分隔符,例如双管道||或其他一些不太可能存在于数据中的模式。
  • 如果可能,您可以使用其他数据格式,如XML,JSON,CSV等。这是比前一个更好的解决方案,因为它始终有效。
  • 在这种特殊情况下,如果您确定只有地址可以包含|但名称和年龄不能包含|,那么您可以使用|进行拆分,将第一个作为名称,最后一个作为年龄和他们之间的所有部分作为地址。如果它们之间有多个部分,则地址包含|。然后,您可以使用|加入中间部分,因为它们知道它们是地址的一部分。但这不是一个好的解决方案,因为如果在第一个和最后一个字段中允许|,这将不起作用。

答案 5 :(得分:1)

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