在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"
答案 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),而你可能在开头有一个大写的单字符。