多数组返回的java字符串分割

watbbzwu  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(294)

我正在开发一个代码,需要将行按|拆分,以标识和创建树Map。例子:

Op|id       |first_name|last_name|gender|email               
I |123      |".|."     |n/a      |F     |myemail@hotmail.com

你怎么看,一些用户开玩笑说,在文本中间放了一个单反字符,现在,当我们试图用|分隔行时,出现了一个异常行为:

string.split("|")

我创建了以下正则表达式来避免它,但不能完全工作:

(\|)[^.*\"|]


您可以看到,我的代码从|获得下一个字符。我想要的是避免在一个或多个双引号之间出现|
有谁能告诉我如何改进regex吗?

x3naxklr

x3naxklr1#

正则表达式不仅仅是一个奇怪的名字。之所以称之为语法,是因为有一篇论文专门描述了一整类具有某些性质的语法;这些语法称为正则表达式,正则表达式可以用来解析这些语法。
java字符串文本值不是规则的。
你不能用split做你想做的事。句号。比你想象的要复杂得多。
如果您提供了一个字符串文本的规范,那么您就可以完成这项工作,但是您没有提供这个。如果是原始输入,加上引号,你就被套住了——这是不可能解析的,你的“小丑”可以加上适当的引号之类的。只有一个解决方案:找到读取小丑输入的代码并正确地转义。
让我们假设你做到了/转义代码已经在那里了。您没有指定转义器的“spec”,但关键问题是:如果说小丑在他们的输入中加了引号(“),那会怎样?通常的策略是双引号和反斜杠转义。
输入的原始文本 Hello"| 变成 "Hello""|" . (双引号)
输入的原始文本 Hello"| 变成 "Hello\"|" . (反斜杠转义)。
两者都没有用正则表达式正确解析,所以 split 是个失败者。你不能用它。找一个合适的解析器。
各种csv解析器声音正确;c不是逗号的意思(它是“字符分隔值”——这里是数据,由管道符号分隔,这是一个字符)。它们支持多行条目和所有常用的转义机制。请参见opencsv示例。

lyfkaqu1

lyfkaqu12#

假设平衡报价字符,要在不在报价中的管道上拆分:

string.split("\\|(?=(([^\"]*\"){2})*[^\"]*$)");

观看现场演示。
这是通过在管道字符后要求偶数个引号字符来实现的。

相关问题