【问题标题】:regex: how to include the end of line in search result?正则表达式:如何在搜索结果中包含行尾?
【发布时间】:2016-05-06 19:58:45
【问题描述】:

我有以下字符串:

#key1=value1|#key2=value2|#key3=value3

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

/#(.*)\=(.*)[\|\v\h|]/gU

这对 key1 和 key2 很有效,但不捕获 key3

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

任何想法如何捕获key3?

【问题讨论】:

  • 为什么不用| 分解字符串,然后用= 分解?如果你真的需要一个正则表达式,试试#(.*?)=(.*?)([\v\h|]|$)
  • 显示你执行的命令和输出。

标签: php regex


【解决方案1】:

简单的解决方案

通过将 [\|\v\h|] 替换为 (?:$|[\|\v\h|]),在您的键/值对之后使行尾 ($) 成为可能的匹配项:

/#(.*)\=(.*)(?:$|[\|\v\h|])/gU

Demo

更好的解决方案

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

/#([^=]*)\=([^|]*)(?:$|[\|\v\h|])/gU

Demo

说明

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

注意事项

也就是说,作为Wiktor Stribiżew said in the comments,拆分字符串通常比使用正则表达式进行复杂的解析更容易。确保您没有尝试解决 XY problem 的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多