我正在使用带有正则表达式的ultraedit。我想查找(并替换)和嵌入的双引号,该双引号包含在以双引号开头/结尾的字符串中。这是一个带有管道的文本文件 | 作为分界线。
如何找到嵌入的双引号:
“这个字符串没问题。”|“这是一个中间带“C”双引号等级的例子。”|“下一行”
我最终需要将“C”中的双引号替换为只有 C。
CSV 的最大权衡是在每种情况下都正确解析而不是简单。这是一种适度适度的方法。如果你有真正狡猾的字符串,其中的管道旁边有引号,你最好使用 PERL 和 Text::CSV 之类的东西。
正则表达式需要在引号的每一侧(例如[^|]
)都有一个非管道字符,因为解析器将吸收 C,然后找不到 C 旁边的另一个引号。
只要您的实际 CSV 字符串中没有相邻的管道和引号,此示例就可以很好地工作。前瞻和后随是零宽度,因此它们不会删除除引号之外的任何其他字符。
1 2 3 4
(?<!^)(?<!\|)"(?!\|)(?!$)
这样匹配的每个报价都可以删除。不要忘记指定全局替换以获取所有引号。
试试这个发现:
(["][^"]*)["]C["]([^"]*["])
并替换:
\1C\2
在 Perl 模式下打开正则表达式。
的屏幕截图
UltraEdit Professional Text/HEX Editor
Version 21.30.0.1005
从...开始:
"This string is ok."|"This is example with a "C" double quoted grade in middle."|"Next line"
"This string is ok."|"This is example with a C double quoted grade in middle."|"Next line"
以。。结束:
"This string is ok."|"This is example with a C double quoted grade in middle."|"Next line"
"This string is ok."|"This is example with a C double quoted grade in middle."|"Next line"
第一部分。
(["][^"]*)
from (["][^"]*)["]C["]([^"]*["])
这会查找以下序列:
["]
.[^"]*
["][^"]*
表示正则表达式引擎应该存储这个字符序列,以便 REPLACE 部分可以引用它(作为反向引用)。第二部分。
["]C["]
from (["][^"]*)["]C["]([^"]*["])
这会查找以下序列:
["]
.["]
.\1C\2
\1
是一个反向引用,表示将其替换为已保存的第一个序列。\2
是一个反向引用,表示用保存的第二个序列替换它。你真的不想用正则表达式来做这件事。您应该使用可以理解管道分隔符的 csv 解析器。如果我只使用正则表达式,我会使用多个替换,如下所示:
查找并用占位符替换好的引号到文本。开始/结束报价:
s/(^"|"$)/QUOTE/g
管道分隔符附近的引号:
s/"\|"/DELIMITER/g
现在只剩下嵌入的双引号。要删除所有这些:
s/"//g
现在把好的引号放回去:
s/QUOTE|DELIMITER/"/g
nanny发布了一个很好的解决方案,但对于 Perl 脚本,不适用于 UltraEdit 等文本编辑器。
通常,可以在字段值中使用双引号。但是每个双引号必须用另外一个双引号进行转义。例如,在有关逗号分隔值的 Wikipedia 文章中对此进行了解释。
这种非常简单的转义算法使得在 CSV 文件中逐个字符地读取以编程语言编码的字符非常容易。但是双引号中包含的双引号、分隔符和换行符对于 CSV 文件中的正则表达式查找和替换来说是一场噩梦。
我在 UltraEdit 宏中记录了几个替换
InsertMode
ColumnModeOff
Top
PerlReOn
Find MatchCase RegExp "^"|"$"
Replace All "QuOtE"
Find MatchCase ""|"
Replace All "QuOtE|"
Find MatchCase "|""
Replace All "|QuOtE"
Find MatchCase """"
Replace All "QuOtEQuOtE"
Find MatchCase """
Replace All """"
Find MatchCase "QuOtE"
Replace All """
第一个替换是 Perl 正则表达式替换。行首或行尾的每个双引号都被字符串QuOtE通过此替换替换。我很确定CSV 文件中不存在QuOtE 。
管道字符前后的每个双引号也被QuOtE替换为接下来的 2 个非正则表达式替换。
CSV 文件中的转义双引号""
接下来被QuOtEQuOtE替换为非正则表达式替换。
现在剩下的单双引号被两个双引号替换,使它们在 CSV 文件中有效。您当然也可以删除那些单双引号。
最后,所有QuOtE都被替换回双引号。
注意:这不是最终的解决方案。然而,这些替换可能会产生错误的结果,例如对于像这样的已经有效的 CSV 行
"first value with separator ""|"" included"|second value|"third value again with separator|"|fourth value contains ""Hello!"""|fifth value
结果是
"first value with separator """|""" included"|second value|"third value again with separator|"|fourth value contains ""Hello!"""|fifth value
PS:上面的有效示例行应在电子表格应用程序中显示为
first value with separator "|" included second value third value again with separator| fourth value contains "Hello!" fifth value