我实际上正在使用.tsv
数据库,该数据库的标题充满了对我来说有意义的东西。
因此,我想将它们从标头中剥离出来,以供我和其他用户使用(不精通关系数据库,因此我们最终大多使用Excel来组织数据并处理它),通过破坏,可以更好地使用Excel。他们与标签。
标头示例:
>(name1)database-ID:database2-ID:value1:value2
(我知道将值放在标头中似乎很奇怪,但这是与标头关联的第三个值的参数的描述,我们不必在这里弄乱)
输出为:
name1\tdatabase-ID\tdatabase2-ID\tvalue1\tvalue2\n
因此,我将数据(标题,每行一个)粘贴到EmEditor(BOOST语法)中,并附带以下正则表达式:
>\((.*)\)(.*?)\:(.*?)\:(.*?)\:(.*?)\n
然后,通过在每个捕获组之间插入制表符,将每个捕获组彼此分离。它可以完美匹配,没有问题。
但是我发现有些格式不正确的行不符合整个数据库的逻辑,所以我想做一个表达式将它们立即分开。
如果我用错误的行表示,它将是:
>(name1)database-ID:database2-ID:value1-1:value1-2\n
>(name2)database-ID:database2-ID:value2-1:value2-2\n
>(name3)database-ID:database2-ID:value3-1value3-2\n
最后一行格式错误,因为最后两个值之间都缺少
:
。我希望通过解决识别格式正确的行的原始表达式来进行匹配。
我完全知道,我可以通过稍微调整我的第一个表情来消除不同的线条并检索变形后的表情,从而提供不同的解决方案,但是
我不想为自己的过程提供解决方案,我只是想了解自己在那里做得不好的事情;从而使我受过更好的教育(不仅能够通过规避自己无法解决的错误而变得更加棘手):
我尝试对上述表达式进行否定:
([^(>\((.*)\)(.*?)\:(.*?)\:(.*?)\:(.*?)\n)])
那与任何东西都不匹配。
我尝试了一个否定的前瞻,但是它将非常缓慢,非常缓慢,然后将匹配文档中可能存在的每0个长度的匹配项:
(?!(^>\((.*)\)(.*?)\:(.*?)\:(.*?)\:(.*?)\n))
因此,我在后面添加了一个字符串捕获组,
但它也不起作用:
(?!(^>\((.*)\)(.*?)\:(.*?)\:(.*?)\:(.*?)\n))(^.*?)
因此,请向我解释一下否定组(
[^whatever]
)和否定超前用法在哪里出问题了? 最佳答案
因此,请向我解释一下否定组([^whatever]
)和否定超前用法在哪里出问题了?
让我们首先解决这个问题:[^(pattern)]
是做什么的?
您似乎有一个误解,并期望它:
pattern
之外的所有内容。 (否定)它的实际作用是:
(
,p
,a
,t
,... n
,)
的任何字符。 因此,模式
([^(>\((.*)\)(.*?)\:(.*?)\:(.*?)\:(.*?)\n)])
...匹配不是
(
,>
,(
,... \n
,)
的字符。至于负面的前瞻,您只是做错了。锚
^
的位置错误,因此您的断言将无法提供任何有用的帮助。完全不是负面的预言。(?!(^>\((.*)\)(.*?)\:(.*?)\:(.*?)\:(.*?)\n))
我将解释它的作用:
(?!
打开否定超前组:在不移动指针位置的情况下,声明位置与该模式不匹配。 (
捕获组。在否定的前瞻性中使用捕获组是没有用的,因为否定的前瞻性组中的子模式永远不会匹配。 ^
在字符串开头声明位置。 >\(
文字字符序列“>(” 。(.*)
捕获组,它匹配除换行符之外的尽可能多的字符,然后回溯。 \)
文字字符“)” 。 (.*?)
捕获组,除换行符外,任何字符都不愿意进行零对一匹配。 \:
文字字符“:” 。 (.*?)\:(.*?)\:(.*?)
\n
新行。 )
关闭捕获组。 )
关闭否定超前组。当该断言完成时,指针位置与开始位置相同,因此结果匹配为零长度。 请注意,锚点嵌套在负前瞻组内。应该在开始时:
^(?!(>\((.*)\)(.*?)\:(.*?)\:(.*?)\:(.*?)\n))
尽管这并没有返回任何有用的信息,但它解释了问题所在,因为您不需要解决方案。 ;)
如果您突然需要解决方案,请参阅我的相关答案(我不会在帖子中添加其他内容):
关于regex - 对于此意外的负前瞻子模式,我犯了什么错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26783827/