我正在使用带有正则表达式的ultraedit。我想找到(并替换)和嵌入双引号,其中包含以双引号开头/结尾的字符串。这是一个带管道的文本文件作为界限。
如何找到嵌入式双引号:
"这个字符串没问题。" |"这是" C"中间双引号。" |"下一行"
我最终需要更换" C"中的双引号。只有C。
答案 0 :(得分:2)
CSV中的重大折衷是在每种情况下都是正确的解析而不是简单。 这是一种合理调节的方法。如果你的管道旁边有引号,那么你最好使用PERL和Text :: CSV之类的东西。
有一个正则表达式的麻烦,需要在引号的每一边都有一个非管道字符(例如[^|]
),因为解析器会吸收C然后再找不到另一个引用C旁边。
只要您在实际的CSV字符串中没有彼此相邻的管道和引号,此示例就可以正常运行。前瞻和后方是零宽度,因此除了引用之外,它们不会删除任何其他字符。
1 2 3 4
(?<!^)(?<!\|)"(?!\|)(?!$)
这样匹配的每个报价都可以删除。不要忘记指定全局替换以获取所有引号。
答案 1 :(得分:1)
试试这个:
(["][^"]*)["]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
是后退参考,表示将其替换为已保存的第二个序列。答案 2 :(得分:0)
答案 3 :(得分:0)
你真的不想用正则表达式来做这件事。您应该使用可以理解管道分隔符的csv解析器。如果我只使用正则表达式,我会使用这样的多个替换:
使用占位符查找并替换带引号的好引号。开始/结束报价:
s/(^"|"$)/QUOTE/g
管道分隔符附近的引号:
s/"\|"/DELIMITER/g
现在只保留嵌入的双引号。删除所有这些:
s/"//g
现在把好的报价放回去:
s/QUOTE|DELIMITER/"/g
答案 4 :(得分:0)
nanny发布了一个很好的解决方案,但对于Perl脚本,不是在UltraEdit等文本编辑器中使用。
通常,字段值中可以使用双引号。但每个双引号必须用一个双引号进行转义。例如,在维基百科关于comma-separated values的文章中对此进行了解释。
这种非常简单的转义算法使得在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 替换为下两个非正则表达式替换。
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