正则表达式匹配两个连续的内容

3
我收到了许多扁平文件,需要对其进行解析。其中一个文件包含评论字段,该字段经常包含双引号。
这并不是什么大问题,但问题在于该文件是一个用管道分隔的双引号限定文件!
下面我将概述我得到的字符串。
0|0.9|""|"M"|"X"|"0.2"|"This is the string with the "double" double quotes"

这是我想要的字符串。

0|0.9|""|"M"|"X"|"0.2"|"This is the string with the double double quotes"

我的想法是使用一个简单的正则表达式"(?!\|)(?<!\|)"

然而,这仍然匹配了两个连续的双引号,这构成了一个空字段。

我也尝试过

\|*"\|*

我认为这会匹配任何不邻近管道的双引号。

但是,这捕获了所有的双引号。

这似乎应该很容易,但是我卡住了。

任何帮助将不胜感激。


1
基于什么标准移除了 X0.2 - Asad Saeeduddin
抱歉,那是我的错误。我已经更正了。唯一要删除的是注释字段中的双引号。 - Shawn Taylor
(?<=\|")(?:[^"|]*"[^"|]*)+(?="(\||$)) 返回包含引号的任何分隔值,作为一个开始。http://www.rubular.com/r/yte3svDalb 你使用的是什么编程语言? - Asad Saeeduddin
2
请在问题和运行环境中包含实际的问题,Shawn。我假设您想要删除引号?请注意,答案可能包含并非所有正则表达式引擎都具有的功能。 - Maarten Bodewes
现在是在Notepad ++中进行查找/替换。在我将它们在SSIS中处理之前,我会用PHP解析文件。我遇到的问题是,SSIS文件解析器没有处理这种情况的方法。它有可以处理它的转换,但是解析器在将该行传递到集成的下一部分之前就崩溃了。因此,我需要预处理它们。 - Shawn Taylor
1个回答

2

在一般情况下,这显然是不可能的——如果评论中含有You need to use a pipe ("|") rather than < and >,该怎么办呢?但是对于99%的情况,您可以编写以下内容:

(?<!\|)"(?!\|)

匹配一个双引号,它既不是前面也不是后面跟着一个管道符号,或者更好的方法:
(?<!\||^)"(?!\||$)

还需要满足它不与字符串的任一端相邻。


如果正则表达式引擎当然可以处理零宽度的前瞻/后顾。 - Maarten Bodewes
@owlstead:是的,绝对没问题。问题中包含了(?<!,所以我认为使用它是安全的,但我可能应该明确地提到它。 - ruakh
我注意到你颠倒了前瞻和后顾之间的顺序。这个顺序很重要吗?谢谢,肖恩。 - Shawn Taylor
1
@ShawnTaylor:我并没有完全颠倒顺序,而是将后顾和"放在前面,将前瞻放在后面。它们的相对顺序并不重要,但它们的确切位置很重要。(例如,正则表达式(?!\|)“(?<!\|)将等同于正则表达式",因为前瞻和后顾都只是断言"不是管道符号。) - ruakh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接