正则表达式:如何在搜索结果中包含行尾?

yar*_*rek 0 php regex

我有以下字符串:

#key1=value1|#key2=value2|#key3=value3
Run Code Online (Sandbox Code Playgroud)

我正在使用此正则表达式来匹配键和值:

/#(.*)\=(.*)[\|\v\h|]/gU
Run Code Online (Sandbox Code Playgroud)

它适用于key1和key2,但不捕获key3

演示:https://regex101.com/r/eU6lV8/2

任何想法如何捕获key3?

eli*_*ide 5

简单解决方案

$通过替换[\|\v\h|](?:$|[\|\v\h|]):在键/值对后面的行结束()可能匹配:

/#(.*)\=(.*)(?:$|[\|\v\h|])/gU
Run Code Online (Sandbox Code Playgroud)

演示

改善方案

更好的是,您可以通过删除.*组来调整原始正则表达式的效率(正如anubhava在现在删除的注释中所建议的那样):

/#([^=]*)\=([^|]*)(?:$|[\|\v\h|])/gU
Run Code Online (Sandbox Code Playgroud)

演示

说明

你原来的正则表达式不工作的原因是,\v\h只匹配垂直和水平的空白,分别.它们与根本没有任何空格的行的末尾不匹配.

一句警告

也就是说,正如WiktorStribiżew在评论中所说,分割字符串通常更容易,而不是使用正则表达式进行复杂的解析.确保您没有尝试解决XY问题的实例.