正则表达式在FileHelpers BeforeReadRecords事件中使用两个双引号的字段操作所有单个双引号

时间:2014-04-28 08:11:04

标签: regex vb.net filehelpers

在Filehelpers BeforeReadRecords事件中,我们需要正则表达式来操作具有两个双引号的字段中的所有单个“双引号”。

CSV内容:

"Mine"s Minesweeper", "Yours"s Minesweeper", "Uncle Sam"s Minesweeper"
"Mine"s Minesweeper2", "Yours"s Minesweeper2", "Unknown Minesweeper3"

需要帮助创建一个vb.net正则表达式来替换所有内部双引号。目前我们正在使用以下批准?

Dim engine As New FileHelperEngine(cb.CreateRecordClass())
                AddHandler engine.BeforeReadRecord, AddressOf BeforeReadRecordHandler

活动代码

    Sub BeforeReadRecordHandler(engine As EngineBase, e As FileHelpers.Events.BeforeReadEventArgs(Of Object))
        Try
            Dim newLine As String = ""
            Dim sep As String = ""
            Dim arr() As String = e.RecordLine.Split(",")
            arr.AsParallel().ForAll(Sub(x)
                                        If x.Length > 1 Then
                                            newLine = String.Format("{0}{1}{2}", newLine, sep, x.Substring(1, IIf(x.Length <= 2, 0, x.Length - 2)).Replace("""", """"""))


                                        Else
                                            newLine = String.Format("{0}{1}{2}", newLine, sep, x)
                                        End If

                                        sep = ","
                                    End Sub)
            e.RecordLine = newLine
        Catch ex As Exception

        End Try
    End Sub

尝试为;

生成正则表达式
String.Format("{0}{1}{2}", newLine, sep, x.Substring(1, IIf(x.Length <= 2, 0, x.Length - 2)).Replace("""", """""")).

输出应为

CSV Content:

"Mine""s Minesweeper", "Yours""s Minesweeper", "Uncle Sam""s Minesweeper"
"Mine""s Minesweeper2", "Yours""s Minesweeper2", "Unknown Minesweeper3"

3 个答案:

答案 0 :(得分:0)

您可以使用负向lookbehind和负向前瞻以某种方式完成此操作,例如,请参阅此regex

(?<!^)(?<!, )"(?!$)(?!, )(?!")

这个正则表达式当然有一些问题,它假设:

  • 没有要替换的双引号后跟(,)。
  • 没有要替换的双引号前面是(,)。
  • 分隔逗号后面跟着一个空格。

如果您可以确保以上内容对您的输入有效,请使用我引用的regex

答案 1 :(得分:0)

.Net支持任意长度的lookbehind,因此您可以使用以下内容;

(?<!(^|,)\s*)"(?!\s*($|,))

一起使用
Regexp.replace(input,(?<!(^|,)\s*)"(?!\s*($|,)),"""""",RegexOptions.Multiline)

这匹配任何“不以行开头或逗号开头,并且不会被字符串或逗号的结尾所取代,这两个条件都忽略了任意数量的空格。

如果CSV中的条目未被引号括起来,或者条目文本中出现逗号,则会出现异常。

答案 2 :(得分:0)

可能会出现更多错误,您可以使用正向前瞻和后备替换来替换字母所包围的任何"个字符。

显然,这假设您要替换的唯一"字符会立即被字母包围。

(?!>[A-Za-z])"(?=[a-z]) // Use with a Regex.Replace.

我假设后面的字母字符都是小写字母(通常是s),而你可能在开头有一个大写的单字符。