我试图创建一个可以在两个分隔符之间找到字符串的正则表达式。我有这样的日志数据:
1234 ^||^ 5678 ^||^ 127.0.0.1 ^|x|x|^
它类似于CSV,但数据以^||^
分隔,并且行以^|x|x|^
终止。我无法控制这一点,这是第三方向我们发送数据的方式。
我试图捕获分隔符之间的所有数据。我想出了这个正则表达式,使用了分隔符或行结束的正向前瞻:
[^\^]+(?=(\s\^\|\|\^\s|\s\^\|x\|x\|\^))
这很接近,但问题是,只要文本中出现^
,就没有匹配项。如果我将[^\^]+
替换为.+
,则正则表达式会变得过于贪婪,并且会匹配到最后一个字段的所有内容,包括分隔符本身。
我需要更改哪些内容才能匹配^||^
分隔符之间的所有内容,包括^
?
答案 0 :(得分:2)
如果您的语言支持正则表达式正面观察(例如:PCRE),您可以使用这个,否则您可以使用@degant one:
(?<=^|\^\|\|\^\s).+?(?=\s\^\|x?\|x?\|?\^)
<强>解释强>
(?<=^|\^\|\|\^\s)
在开始锚点或^ || ^
.+
至少一个字符
(?=\s\^\|x?\|x?\|?\^)
后跟^ |,可选x,| ,可选x,可选|,^
答案 1 :(得分:1)
以下正则表达式如何捕获任何内容(包括包含^
甚至|
的文字):
(.+?)(?:\s\^\|x?\|x?\|?\^\s?)
并使用捕获组1来获取您正在查找的文本。
对于测试字符串1^2|34 ^||^ 56|7|8 ^||^ 6^9 ^|x|x|^
提取1^2|34
,56|7|8
和6^9
编辑: @ stej4n指出的改进。