Ruby .split(各种分隔符)在匹配数组中保留分隔符

时间:2014-09-16 05:10:57

标签: ruby regex

我正在处理导出的.csv文件中包含注释字段的导出文件。导出的注释看起来像这样。

" AC)Dianne - #或拨打的代码不正确。 AC)dianne - #或拨打的代码不正确。 WDB)Dianne - 错误号码。 AC)Dianne - 拨打的#或代码不正确。"

在此字段中,我们有一位用户将笔记和实际笔记本身留下。

文件中的分隔符是" AC)"或者" WDB)"

我需要把它们写成:

AC) Dianne - # or code dialed is incorrect.
AC) dianne - # or code dialed is incorrect.
WDB) Dianne - Wrong Number.
AC) Dianne - # or code dialed is incorrect.

使用正则表达式和ruby函数.split我可以在分隔符后输出文本,但是我丢失了捕获笔记的用户。

红宝石

notes.split( /AC\)|WDB\)/ ).each do |n|
    puts n  
end     

输出

Dianne - # or code dialed is incorrect.
dianne - # or code dialed is incorrect.
Dianne - Wrong Number.
Dianne - # or code dialed is incorrect.

在上面的代码中,我不知道谁离开了个人笔记的用户(AC,WDB)。

我不确定是否需要切换到.scan,更改正则表达式(即包括lookbehind)等。 有没有人知道如何捕获用户和文本看起来像这样?

输出

AC) Dianne - # or code dialed is incorrect.
AC) dianne - # or code dialed is incorrect.
WDB) Dianne - Wrong Number.
AC) Dianne - # or code dialed is incorrect.

2 个答案:

答案 0 :(得分:4)

根据以下前瞻分割输入,

(?=AC\)|WDB\))

Lookarounds是零宽度断言。它不会匹配任何字符,但它用于条件检查目的。

<强>代码:

> "AC) Dianne - # or code dialed is incorrect. AC) dianne - # or code dialed is incorrect. WDB) Dianne - Wrong Number. AC) Dianne - # or code dialed is incorrect.".split(/(?=AC\)|WDB\))/)
=> ["AC) Dianne - # or code dialed is incorrect. ", "AC) dianne - # or code dialed is incorrect. ", "WDB) Dianne - Wrong Number. ", "AC) Dianne - # or code dialed is incorrect."]

答案 1 :(得分:0)

你可以试试这个 -

notes.gsub!(/\s+((?:AC\))|(?:WDB\)))/, '\n\1')

测试正则表达式here