当前位置: 首页 > 面试题库 >

用Java中的RegEx解析CSV输入

花飞尘
2023-03-14
问题内容

我知道,现在我有两个问题。但是我很开心!

我从这个建议开始,不是尝试拆分,而是匹配一个可接受的字段,然后从那里扩展到这个表达式。

final Pattern pattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?=,|$)");

表达式看起来像这样,没有烦人的转义引号:

"([^"]*)"|(?<=,|^)([^,]*)(?=,|$)

这对我来说效果很好-要么匹配“两个引号以及它们之间的引号”,要么匹配“行首或逗号与行尾或逗号之间的内容”。遍历比赛获得所有字段,即使它们为空。例如,

the quick, "brown, fox jumps", over, "the",,"lazy dog"

分解成

the quick
"brown, fox jumps"
over
"the"

"lazy dog"

大!现在,我想删除引号,因此像在逗号中一样,在非捕获组中添加了先行和后退。

final Pattern pattern = Pattern.compile("(?<=\")([^\"]*)(?=\")|(?<=,|^)([^,]*)(?=,|$)");

表达式再次是:

(?<=")([^"]*)(?=")|(?<=,|^)([^,]*)(?=,|$)

而不是预期的结果

the quick
brown, fox jumps
over
the

lazy dog

现在我得到了这个细分:

the quick
"brown
 fox jumps"
,over,
"the"
,,
"lazy dog"

我想念什么?


问题答案:

运算符优先级。基本上没有。从左到右。因此,或(|)应用于闭引号超前和逗号超前

尝试:

(?:(?<=")([^"]*)(?="))|(?<=,|^)([^,]*)(?=,|$)


 类似资料:
  • 我有一个字符串数组,如下所示: 拆分数组后,打印以下内容: 我得到的输出是: 我想要的是删除逗号、https和not'之类的单个字母的所有实例(在使用上面的方法之后)。所以我想以这个结束: 我试过像这样做replaceAll: 但这只是给了我相同的初始输出,没有任何变化。有什么想法吗?

  • 我有一个带有注释的csv文件,其值需要在两个ArrayList之间拆分。例如: 实现这一目标的最佳方式是什么?我是否应该使用一个计数器,每次状态从%变到某个值时递增,反之亦然,然后如果计数器% 2 = 0,那么添加一个新的ArrayList并开始写入它?这是我能想到的唯一办法,但似乎有点笨拙,还有人有更好的主意吗? 编辑:我已经写了实际解析csv值的代码,我不需要帮助,只是想知道如何将值分成两个列

  • 最近拿起Ruby,一直在摆弄它。我想学习如何使用regex或其他Ruby技巧来检查给定文本行中的某些单词、空格字符、有效格式等。 假设我有一个严格如下格式的订单列表: 分号后面有一个空格,每个逗号后面没有空格,结尾没有尾随空格等等。如何使用Ruby检查此格式中的错误?例如,我的检查应该失败: 我的目标是将字符串拆分为“”并检查第一个单词是否为“cost:”,第二个单词是否为数字等等,但我意识到拆分

  • 在这段代码中,目标是解析一个CSV文件,并将其数据映射到一个bean对象。 文件中的列在原始数据下方有一个标题,有时还有其他信息(如字符串或整数单元格中的数字或单词)。 我在之前的问题中询问如何忽略这些附加信息,并得到了以下代码作为答案: 当我尝试实现此代码时,我在箭头标记的行处出现两个错误。 线程"main"中的异常java.lang.错误:未解决的编译问题: 列表类型中的方法 add(Coun

  • 如果希望将逗号分隔值(CSV)文本的文件解析为xml结构,或者有一个具有非常相似的行/字段结构的平面文件,希望将其转换为XML格式。 这里将使用函数将输入文件分成不同的行。 然后将使用函数将每一行解析为单独的字段。 请注意,将删除前导和尾随空格。 基本例子 输出结果 - 第1行中的数据字典示例 第二个示例将使用CSV文件的第一行作为每行每列的元素名称的数据字典。 输出结果如下 -