使用正则表达式在双引号内的字符串中查找双引号

时间:2014-11-24 19:05:31

标签: regex ultraedit

我正在使用带有正则表达式的ultraedit。我想找到(并替换)和嵌入双引号,其中包含以双引号开头/结尾的字符串。这是一个带管道的文本文件作为界限。

如何找到嵌入式双引号:

  

"这个字符串没问题。" |"这是" C"中间双引号。" |"下一行"

我最终需要更换" C"中的双引号。只有C。

5 个答案:

答案 0 :(得分:2)

CSV中的重大折衷是在每种情况下都是正确的解析而不是简单。 这是一种合理调节的方法。如果你的管道旁边有引号,那么你最好使用PERL和Text :: CSV之类的东西。

有一个正则表达式的麻烦,需要在引号的每一边都有一个非管道字符(例如[^|]),因为解析器会吸收C然后再找不到另一个引用C旁边。

只要您在实际的CSV字符串中没有彼此相邻的管道和引号,此示例就可以正常运行。前瞻和后方是零宽度,因此除了引用之外,它们不会删除任何其他字符。

   1     2       3    4
(?<!^)(?<!\|)"(?!\|)(?!$)
  1. 不要在行的开头匹配引号。
  2. 不要在前面用管道匹配报价。
  3. 之后不要用引号匹配引号。
  4. 不要在字符串末尾匹配引号。
  5. 这样匹配的每个报价都可以删除。不要忘记指定全局替换以获取所有引号。

答案 1 :(得分:1)

试试这个:

(["][^"]*)["]C["]([^"]*["])

并替换:

\1C\2

在Perl模式下启用正则表达式。

Screen shot of find replace regex in UltraEdit

的截屏
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["]([^"]*["])

这会查找以下序列:

  1. 双重报价:["]
  2. 不是双引号的任意数量的字符:[^"]*
  3. 围绕["][^"]*的括号表示正则表达式引擎应存储此字符序列,以便REPLACE部件可以引用它(作为后引用)。
  4. 请注意,这会在开头和结尾重复 - 这意味着存储了两个序列。
  5. 第二部分。

    ["]C["]
    from (["][^"]*)["]C["]([^"]*["])
    

    这会查找以下序列:

    1. 双重报价:["]
    2. 大写字母C(可能代表或不代表Cookie)。
    3. 双重报价:["]
    4. 正则表达式REPLACE的细分。

      \1C\2
      
      1. \1后退参考,表示将其替换为第一个保存的序列
      2. 大写字母C(可能代表或不代表Cookie)。
      3. \2后退参考,表示将其替换为已保存的第二个序列

答案 2 :(得分:0)

对于您仅提供"\w"的示例,您可以使用正则表达式查找"C"

试试here

替换机制可能内置于ultraedit

答案 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