正则表达式搜索某个分隔符

时间:2017-05-17 11:44:19

标签: regex regex-lookarounds

我试图创建一个可以在两个分隔符之间找到字符串的正则表达式。我有这样的日志数据:

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

它类似于CSV,但数据以^||^分隔,并且行以^|x|x|^终止。我无法控制这一点,这是第三方向我们发送数据的方式。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

如果您的语言支持正则表达式正面观察(例如:PCRE),您可以使用这个,否则您可以使用@degant one:

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

Demo

<强>解释

(?<=^|\^\|\|\^\s)在开始锚点或^ || ^

之前

.+至少一个字符

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

Demo

答案 1 :(得分:1)

以下正则表达式如何捕获任何内容(包括包含^甚至|的文字):

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

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

Regex101 Demo

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

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

编辑: @ stej4n指出的改进。