Ruby 当行也由分隔符分隔时,\r\n如何在制表符之间去掉带引号的字符串?

Ruby 当行也由分隔符分隔时,\r\n如何在制表符之间去掉带引号的字符串?,ruby,regex,csv,Ruby,Regex,Csv,在Ruby 2.1.3中,我有一个表示标题的字符串,例如以制表符分隔的csv文件格式: string = "helloworld\r\n14522\tAB-12-00420\t\"PROTOCOL \r\nRisk Effectiveness \r\nand Device Effectiveness In \r\Ebola Candidates \"\tData Collection only\t\t20\t" 我只想在以协议开头的以制表符分隔的部分去掉“\r\n”,这样我就可以阅读完整的标题

在Ruby 2.1.3中,我有一个表示标题的字符串,例如以制表符分隔的csv文件格式:

string = "helloworld\r\n14522\tAB-12-00420\t\"PROTOCOL \r\nRisk Effectiveness \r\nand Device Effectiveness In \r\Ebola Candidates \"\tData Collection only\t\t20\t"
我只想在以协议开头的以制表符分隔的部分去掉“\r\n”,这样我就可以阅读完整的标题“埃博拉候选者中的协议风险有效性和设备有效性”…我希望最终结果是:

"helloworld\r\n14522\tAB-12-00420\t\"PROTOCOL Risk Effectiveness and Device Effectiveness In Heart Failure Candidates \"\tData Collection only\t\t20\t"
如果我不这样做,尝试通过CSV读取它会截断标题,因此我只会阅读“协议”,而不会阅读标题的其余部分


请记住,标题中可能有数量不确定的\r\n字符要删除(我将通过不同的标题进行解析)。我如何做到这一点?我在想正则表达式可能是一种方式…

不幸的是,我不懂ruby,我将提供的解决方案不是很好,但下面是:

由于ruby的regex实现不支持动态宽度lookbehinds,因此我无法找到一个仅与要删除的
\r\n
匹配的模式。但是您可以替换此正则表达式模式的所有匹配项

(\t"?PROTOCOL[^\t]*)[\r\n]+
使用
\1
(组1已匹配的文本),直到模式不再匹配。只有一次替换不会删除所有出现的
\r\n

我希望您能找到更好的解决方案。

因为换行符(引号外)被视为分隔符,
您可以使用此正则表达式隔离带引号的字段,然后替换任何
\r?\n
只是
在这个领域内

然后将字符串传递到CSV模块中

共有3个组构成整个比赛。
1.分隔符
2.双引号字段
3非引号字段

需要替换为回调函数实现。
在回调中,如果组2不为空,则单独替换所有CRLF。
连锁goup 1+替换(第2组)+第3组,然后返回连锁

 # ((?:^|\t|\r?\n)[^\S\r\n]*)(?:("[^"\\]*(?:\\[\S\s][^"\\]*)*"(?:[^\S\r\n]*(?=$|\t|\r?\n)))|([^\t\r\n]*(?:[^\S\r\n]*(?=$|\t|\r?\n))))

 (                             # (1 start), Delimiter tab or newline
      (?: ^ | \t | \r? \n )
      [^\S\r\n]*                    # leading optional whitespaces
 )                             # (1 end)
 (?:
      (                             # (2 start), Quoted string field
           "
           [^"\\]* 
           (?: \\ [\S\s] [^"\\]* )*
           "
           (?:
                [^\S\r\n]*                    # trailing optional whitespaces
                (?= $ | \t | \r? \n )         # Delimiter ahead, tab or newline
           )
      )                             # (2 end)
   |                              # OR
      (                             # (3 start), Non quoted field
           [^\t\r\n]* 
           (?:
                [^\S\r\n]*                    # trailing optional whitespaces 
                (?= $ | \t | \r? \n )         # Delimiter ahead, tab or newline
           )
      )                             # (3 end)
 )

csv模块是否实际截断了
\r\n
上的字段?你不能告诉它不要吗?否则,在获取值时只需删除换行符。也可以在将字符串传递给CSV之前删除换行符,因为它不会对定界产生影响。是的,使用CSV.parse会自动截断“协议”的标题。我正在读取多个由换行符分隔的行,因此告诉它不要在换行符上截断,这意味着我无法解析其余的数据。每一列数据(如标题)都由选项卡分隔。您是否将每一行单独传递给CSV?CSV驻留在dropbox中。我通过dropbox API调用它,它以字符串的形式返回。这个字符串是CSV.parse的输入。谢谢,我使用了ruby#gsub方法的一个块,它解决了这个问题!