正则表达式搜索特定分隔符之前的所有内容

Regular expression search everything before a certain separator

我正在尝试创建一个可以在两个分隔符之间查找字符串的正则表达式。我的日志数据如下所示:

1234 ^||^ 5678 ^||^ 127.0.0.1 ^|x|x|^

它就像一个 CSV,尽管数据以 ^||^ 分隔并且行以 ^|x|x|^ 终止。我对此无法控制,这是第三方向我们发送数据的方式。

我正在尝试捕获分隔符之间的所有数据。我想出了这个正则表达式,使用分隔符或行尾的正前瞻:

[^\^]+(?=(\s\^\|\|\^\s|\s\^\|x\|x\|\^))

这很接近,但问题是一旦 ^ 出现在文本中,就没有匹配项。如果我将 [^\^]+ 替换为 .+,则正则表达式变得过于贪婪并且会匹配直到最后一个字段的所有内容,包括分隔符本身。

我需要更改什么才能匹配 ^||^ 分隔符之间的所有内容,包括 ^

如果你的语言支持正则表达式正向回顾(例如:PCRE),你可以使用这个,否则你可以使用@degant 一个:

(?<=^|\^\|\|\^\s).+?(?=\s\^\|x?\|x?\|?\^)

Demo

说明

(?<=^|\^\|\|\^\s) 前面有开始锚点或 ^||^

.+至少一个字符

(?=\s\^\|x?\|x?\|?\^)后跟^|,可选x,| , 可选 x, 可选 |, ^

Demo

下面的正则表达式怎么样,它将捕获任何内容(包括包含 ^ 甚至 | 的文本):

(.+?)(?:\s\^\|x?\|x?\|?\^\s?)

并使用捕获组 1 来获取您要查找的文本。

Regex101 Demo

测试字符串1^2|34 ^||^ 56|7|8 ^||^ 6^9 ^|x|x|^

它提取 1^2|3456|7|86^9

编辑: @stej4n 指出的改进。