我有一个使用管道符号“|作为分隔符的字符串。但是,字符串数据还包含管道符号。有没有办法忽略它?
示例:
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
答案 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
通过这种方式,您可以随时通过
取回用户输入的内容但我鼓励您使用此库,例如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)
||
或其他一些不太可能存在于数据中的模式。|
但名称和年龄不能包含|
,那么您可以使用|
进行拆分,将第一个作为名称,最后一个作为年龄和他们之间的所有部分作为地址。如果它们之间有多个部分,则地址包含|
。然后,您可以使用|
加入中间部分,因为它们知道它们是地址的一部分。但这不是一个好的解决方案,因为如果在第一个和最后一个字段中允许|
,这将不起作用。答案 5 :(得分:1)
您可以通过某种方式转义用户输入。例如,如果|
是您的分隔符,并且您的数据包含一个分隔符,请将其更改为%p
(p代表管道!)。但是,你也必须逃脱所有%
。在序列化数据时执行此操作,然后在反序列化时将其撤消。