我有一个使用管道符号“| 作为分隔符的字符串。但是,字符串数据也包含管道符号。有没有办法忽略这个?
例子:
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
我有一个使用管道符号“| 作为分隔符的字符串。但是,字符串数据也包含管道符号。有没有办法忽略这个?
例子:
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
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];
}
但是,字符串数据也包含管道符号。有没有办法忽略这个?
这是错误的解决方法。
如果用户输入姓名、地址和年龄,您应该在存储之前对其进行消毒。
那么在这种情况下,您将如何清理用户输入。好吧,您通常会使用反斜杠(在连接最终字符串之前)转义任何用户输入的管道字符,而不是存储
John|123 Wood Road|Street, London|25
你会存储
John|123 Wood Road\|Street, London|25
这样,您始终可以通过以下方式取回用户输入的内容
但是,我鼓励您为此使用库,例如 OpenCSV。
简单的答案是使用不同的分隔符。
尽管这不是万无一失的,因为您可能会在您的某个部分(姓名、地址或年龄)中遇到新的分隔符作为有效字符。
我更好的建议是加入某种转义字符,以便在遇到管道时不将管道视为定界管道。(也许是\
???)
我想您熟悉转义字符的概念,因为您在提供给String.split()
.
“约翰|伍德路 123 号\|伦敦街|25”
这是你想要的?
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
||
或其他不太可能出现在数据中的模式。|
但名称和年龄不能包含|
,那么您可以使用 拆分|
,将第一个作为名称,将最后一个作为年龄,并将它们之间的所有部分作为地址。如果它们之间有多个部分,则地址包含|
. |
然后,您可以在知道它们是地址的一部分的情况下加入中间部分。但这不是一个好的解决方案,因为如果|
在第一个和最后一个字段中允许,这将不起作用。您可以通过某种方式转义用户输入。例如,如果|
是您的分隔符,并且您的数据包含一个分隔符,请将其更改为%p
(p 表示管道!)。但是你也必须逃避 all %
。在序列化数据时执行此操作,然后在反序列化时撤消它。