我正在开发一个代码,需要将行按|拆分,以标识和创建树Map。例子:
Op|id |first_name|last_name|gender|email
I |123 |".|." |n/a |F |myemail@hotmail.com
你怎么看,一些用户开玩笑说,在文本中间放了一个单反字符,现在,当我们试图用|分隔行时,出现了一个异常行为:
string.split("|")
我创建了以下正则表达式来避免它,但不能完全工作:
(\|)[^.*\"|]
您可以看到,我的代码从|获得下一个字符。我想要的是避免在一个或多个双引号之间出现|
有谁能告诉我如何改进regex吗?
2条答案
按热度按时间x3naxklr1#
正则表达式不仅仅是一个奇怪的名字。之所以称之为语法,是因为有一篇论文专门描述了一整类具有某些性质的语法;这些语法称为正则表达式,正则表达式可以用来解析这些语法。
java字符串文本值不是规则的。
你不能用split做你想做的事。句号。比你想象的要复杂得多。
如果您提供了一个字符串文本的规范,那么您就可以完成这项工作,但是您没有提供这个。如果是原始输入,加上引号,你就被套住了——这是不可能解析的,你的“小丑”可以加上适当的引号之类的。只有一个解决方案:找到读取小丑输入的代码并正确地转义。
让我们假设你做到了/转义代码已经在那里了。您没有指定转义器的“spec”,但关键问题是:如果说小丑在他们的输入中加了引号(“),那会怎样?通常的策略是双引号和反斜杠转义。
输入的原始文本
Hello"|
变成"Hello""|"
. (双引号)输入的原始文本
Hello"|
变成"Hello\"|"
. (反斜杠转义)。两者都没有用正则表达式正确解析,所以
split
是个失败者。你不能用它。找一个合适的解析器。各种csv解析器声音正确;c不是逗号的意思(它是“字符分隔值”——这里是数据,由管道符号分隔,这是一个字符)。它们支持多行条目和所有常用的转义机制。请参见opencsv示例。
lyfkaqu12#
假设平衡报价字符,要在不在报价中的管道上拆分:
观看现场演示。
这是通过在管道字符后要求偶数个引号字符来实现的。