首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在nom中匹配CSV样式的带引号的字符串?

如何在nom中匹配CSV样式的带引号的字符串?
EN

Stack Overflow用户
提问于 2018-06-07 11:55:15
回答 1查看 688关注 0票数 7

在本问题中,CSV样式引用的字符串是一个字符串,其中:

字符串的开头和结尾恰好是一个双引号,字符串中的双引号被折叠为一个双引号。( ".

  • Two
  1. )"Alo""ha"Alo"ha.
  2. "“本身是一个空字符串。无法分析
  3. 错误输入,如"A""" e"。这是一个A",后面跟着垃圾e".

我尝试了几种方法,但没有一种是完全有效的。

多亏了Mozilla IRC上#nom中的用户pinkieval的一些帮助,我得到了最接近的帮助:

代码语言:javascript
运行
AI代码解释
复制
use std::error as stderror; /* Avoids needing nightly to compile */

named!(csv_style_string<&str, String>, map_res!(
   terminated!(tag!("\""), not!(peek!(char!('"')))),
   csv_string_to_string
));

fn csv_string_to_string(s: &str) -> Result<String, Box<stderror::Error>> {
   Ok(s.to_string().replace("\"\"", "\""))
}

这不能正确地捕捉到字符串的结尾。

我还尝试将re_match!宏与r#""([^"]|"")*""#一起使用,但结果总是Err::Incomplete(1)

我已经确定given CSV example for Nom 1.0不适用于我所描述的带引号的CSV字符串,但我知道实现方式有所不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 23:17:28

这里有一种方法:

代码语言:javascript
运行
AI代码解释
复制
use nom::types::CompleteStr;

use nom::*;

named!(csv_style_string<CompleteStr, String>,
    delimited!(
        char!('"'),
        map!(
            many0!(
                alt!(
                    // Eat a " delimiter and  the " that follows it
                    tag!("\"\"") => { |_| '"' }

                |    // Normal character
                    none_of!("\"")
                )
            ),
             // Make a string from a vector of chars
            |v| v.iter().collect::<String>()
        ),
        char!('"')
    )
);

fn main() {
    println!(r#""Alo\"ha" = {:?}"#, csv_style_string(CompleteStr(r#""Alo""ha""#)));
    println!(r#""" = {:?}"#, csv_style_string(CompleteStr(r#""""#)));
    println!(r#"bad format: {:?}"#, csv_style_string(CompleteStr(r#""A""" e""#)));
}

(我是用全名编写的,但是像您这样的解决方案,基于外部函数而不是map!()每个字符,也可以工作,而且效率可能更高。)

这里的神奇之处在于使用CompleteStr,这也可以解决您的正则表达式问题。这基本上告诉nom在该输入之后不会出现任何内容(否则,nom会假设您正在进行流解析器,因此可能会有更多的输入)。

这是必要的,因为我们需要知道如果"是提供给nom的最后一个字符,该如何处理它。根据它后面的字符(另一个"、普通字符或EOF),我们必须做出不同的决定--因此产生了Incomplete结果,这意味着nom没有足够的输入来做出决定。告诉nom接下来是EOF解决了这种犹豫不决的问题。

nom的作者博客:http://unhandledexpression.com/general/2018/05/14/nom-4-0-faster-safer-simpler-parsers.html#dealing-with-incomplete-usage上进一步阅读Incomplete

您可能会注意到,此解析器实际上并不拒绝无效的输入,而是解析开头并返回其余部分。如果您使用这个解析器作为另一个解析器中的子解析器,那么后者将把剩余的部分提供给下一个子解析器,下一个子解析器也会崩溃(因为它会期望一个逗号),从而导致整个解析器失败。

如果你不想这样,你可以让csv_style_string匹配peek!(alt!(char!(',')|char!('\n")|eof!()))

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50740577

复制
相关文章
正确处理 CSV 文件的引号和逗号
CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便。
仁扬
2023/07/02
1.2K0
字符串 str 包含单个数组带的双引号怎么处理?
要将字符串 "[["121.489764476833","31.3215977774656"]]" 中的双引号去掉,并将内部的经纬度值变为数字类型,你可以使用以下代码:
王小婷
2023/08/26
3310
字符串 str 包含单个数组带的双引号怎么处理?
去除字符串中的双引号「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142601.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
2.7K0
TeX中的引号
在TeX中,左引号是"“",右引号是"”"。输入一篇包含双引号的文章,你的任务时把它转换成TeX的格式。
Vincent-yuan
2020/05/26
1K0
MySQL中的单引号和双引号
《请注意前方高能有引号!》提到过Oracle中引号的处理,其实不仅是Oracle,其他的数据库中,同样存在引号是否使用正确的问题,看到社区的这篇文章,就介绍了MySQL中对单引号和双引号的几种使用场景,可以借鉴学习。
bisal
2023/01/08
4.6K0
MySQL中的单引号和双引号
【Python】字符串 ① ( Python 字符串定义形式 | 单引号定义法 | 双引号定义法 | 三引号定义法 | 字符串中包含单引号或双引号的处理方式 )
文章目录 一、Python 字符串定义形式 二、字符串中包含 单引号 / 双引号 一、Python 字符串定义形式 ---- Python 字符串定义形式 : 单引号定义法 : name = 'Tom' 双引号定义法 : name = "Tom" 三引号定义法 : 该定义方式与多行注释相同 , 使用 三引号 定义字符串 : 如果使用变量接收 , 那么定义的就是字符串 ; 如果没有变量接收 , 那么定义的就是多行注释 ; name = """Tom""" 代码示例 : # 单引号定义字符串 nam
韩曙亮
2023/04/07
3.2K0
【Python】字符串 ① ( Python 字符串定义形式 | 单引号定义法 | 双引号定义法 | 三引号定义法 | 字符串中包含单引号或双引号的处理方式 )
Python中匹配模糊的字符串
如何使用thefuzz 库,它允许我们在python中进行模糊字符串匹配。此外,我们将学习如何使用process 模块,该模块允许我们在模糊字符串逻辑的帮助下有效地匹配或提取字符串。
Python学习者
2023/10/09
5900
【说站】js字符串中的三种引号
2、单引号和双引号基本相同。反引号允许我们通过${…}在字符串中嵌入任何表达式。允许字符串换行。
很酷的站长
2022/11/24
1.5K0
获取字符串内双引号中的所有内容
测试字符串 String str = "[\"内容\",\"标题\"]"; 编码如下: package Action; import java.util.regex.Matcher; import java.util.regex.Pattern; public class demo { public static void main(String[] args) { String str = "[\"内容\",\"标题\"]"; Pattern p = Pattern.compile("\"
红目香薰
2022/11/29
4.5K0
获取字符串内双引号中的所有内容
字符串的匹配算法_多字符串匹配
不要被事物的表面现象所迷惑,这个算法全称:Brute Force,有个拉风的中文名:暴力匹配算法。
全栈程序员站长
2022/09/25
2.2K0
字符串的匹配算法_多字符串匹配
php中的双引号与单引号的基本使用
PHP字符串变量用于存储并处理文本, 在创建字符串之后,我们就可以对它进行操作。我们可以直接在函数中使用字符串,或者把它存储在变量中
itclanCoder
2023/09/14
6100
php中的双引号与单引号的基本使用
delphi字符串加引号_oracle 单引号
sp_qry.Close; sp_qry.SQL.Clear; sp_qry.SQL.Add(‘select * from item_info where item_clsno=’+quotedstr(sp_lb.KeyValue)); sp_qry.Open;
全栈程序员站长
2022/11/10
1.4K0
json.loads()的字符串中为单引号引发的错误
Traceback (most recent call last): File "G:/FastWorkStateServer/logs/redis_fabu.py", line 20, in <module> print(json.loads(str2)) File "D:\python3.6.5\lib\json\__init__.py", line 354, in loads return _default_decoder.decode(s) File "D:\python3.6.5\lib\json\decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "D:\python3.6.5\lib\json\decoder.py", line 355, in raw_decode obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
用户1558882
2018/10/10
3.3K0
shell字符串单双引号的坑
运行非常成功!结果正常输出!然后我就愉快地去重并call variant,但是当我查看g.vcf文件时发现样本名为W0
生信技能树
2021/02/04
5K0
Bash Shell 中单引号和双引号的区别
你会经常在 Linux 命令行中使用引号,处理文件名中的空格?你使用引号。处理特殊字符?你再次使用引号。
网络技术联盟站
2022/04/12
3.8K0
Bash Shell 中单引号和双引号的区别
盘点Pandas中csv文件读取的方法所带参数usecols知识
前几天在Python最强王者群有个叫【老松鼠】的粉丝问了一个关于Pandas中csv文件读取的方法所带参数usecols知识问题,这里拿出来给大家分享下,一起学习。
前端皮皮
2022/08/17
2.7K0
盘点Pandas中csv文件读取的方法所带参数usecols知识
从Oracle批量导出CSV导入到HIVE中(含去掉引号)
以往很多系统经常用的是oracle数据库,在大数据环境下,许多应用都是去IOE的,那么其中老旧数据的迁移或者测试就是其中一块。
sparkexpert
2022/05/07
1.4K0
从Oracle批量导出CSV导入到HIVE中(含去掉引号)
Java在字符串中查找匹配的子字符串
示例: 在源字符串“You may be out of my sight, but never out of my mind.”中查找“my”的个数。输出:匹配个数为2
全栈程序员站长
2022/09/14
7.4K0
点击加载更多

相似问题

用Nom 5解析带转义引号的单引号字符串

11

创建与nom 6.2.1中的nom::IResult匹配的错误

126

如何在rust中使用nom解析对称的带引号的字符串?

117

如何匹配带双引号的字符串和转义的双引号字符?

71

RegExp匹配CSV字段值中的引号

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文