1

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

如何找到嵌入的双引号:

“这个字符串没问题。”|“这是一个中间带“C”双引号等级的例子。”|“下一行”

我最终需要将“C”中的双引号替换为只有 C。

4

5 回答 5

3

CSV 的最大权衡是在每种情况下都正确解析而不是简单。这是一种适度适度的方法。如果你有真正狡猾的字符串,其中的管道旁边有引号,你最好使用 PERL 和 Text::CSV 之类的东西。

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

只要您的实际 CSV 字符串中没有相邻的管道和引号,此示例就可以很好地工作。前瞻和后随是零宽度,因此它们不会删除除引号之外的任何其他字符。

   1     2       3    4
(?<!^)(?<!\|)"(?!\|)(?!$)
  1. 不要匹配行首的引号。
  2. 不要将引号与前面的管道相匹配。
  3. 之后不要将引号与管道匹配。
  4. 不要匹配字符串末尾的引号。

这样匹配的每个报价都可以删除。不要忘记指定全局替换以获取所有引号。

于 2015-01-26T17:33:09.577 回答
1

试试这个发现:

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

并替换:

\1C\2

在 Perl 模式下打开正则表达式。

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"

正则表达式 FIND 的细分。

第一部分。

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

这会查找以下序列:

  1. 双引号:["].
  2. 任意数量的双引号字符:[^"]*
  3. 括起来的括号["][^"]*表示正则表达式引擎应该存储这个字符序列,以便 REPLACE 部分可以引用它(作为反向引用)。
  4. 请注意,这在开始和结束处重复 - 这意味着存储了两个序列。

第二部分。

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

这会查找以下序列:

  1. 双引号:["].
  2. 大写字母 C(可能代表也可能不代表 Cookies)。
  3. 双引号:["].

正则表达式 REPLACE 的细分。

\1C\2
  1. \1是一个反向引用,表示将其替换为已保存的第一个序列
  2. 大写字母 C(可能代表也可能不代表 Cookies)。
  3. \2是一个反向引用,表示用保存的第二个序列替换它
于 2014-11-25T01:04:56.467 回答
0

你真的不想用正则表达式来做这件事。您应该使用可以理解管道分隔符的 csv 解析器。如果我只使用正则表达式,我会使用多个替换,如下所示:

查找并用占位符替换好的引号到文本。开始/结束报价:

 s/(^"|"$)/QUOTE/g

管道分隔符附近的引号:

s/"\|"/DELIMITER/g

现在只剩下嵌入的双引号。要删除所有这些:

s/"//g

现在把好的引号放回去:

s/QUOTE|DELIMITER/"/g
于 2014-11-24T19:28:42.977 回答
0

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
于 2014-11-29T14:54:18.340 回答
0

对于您给出的示例,它"\w"可以作为正则表达式来查找"C"

在这里试试

替换机制可能内置在ultraedit中

于 2014-11-24T19:15:37.557 回答