正则表达式 / preg_match / str_replace 有复杂字符串的问题
Trouble with regex / preg_match / str_replace with complicated string
我在处理复杂的正则表达式时遇到问题。我已经尝试了所有我能想到的方法,但我总是只能得到 "almost" --
我有 5 条消息:
---Agent 1: Wednesday 08/16/2017 | 11:43 AM ---
Message 1
--- Agent 1: Friday 06/09/2017 | 9:02 AM ---
Message 2
--- Agent 1: Friday 04/14/2017 | 10:35 AM ---
Message 3
--- Agent 1: Monday 02/13/2017 | 12:07 AM ---
This
is
message
3
--- Agent 1: Monday 12/19/2016 | 1:31 PM ---
Message 4
--- Agent 1: Monday 10/24/2016 | 10:48 AM ---
Message 5
一个问题是其中一些在第一个 ---
之前有一个 space。另一个是多行消息。
我想做的是剥离所有单独的消息。基本上是 ---
第一次出现和此后每隔一次出现之间的所有内容。我希望我的 结果 看起来像:
---Agent 1: Wednesday 08/16/2017 | 11:43 AM ---
Message 1
我尝试了 ---.*? (---)
的变体(相互匹配 ---
)但是我无法解析消息本身。我也尝试过手动执行此操作:
(?<=\: )(.*?)(?= \|)|(\---)(\r\n|\r|\n)(\r\n|\r|\n)(.*?)(\r\n|\r|\n)(\r\n|\r|\n)(\---)
在您收到多行消息之前,该方法一直有效。 (消息 3)
我也尝试了多个步骤 -- trimming
第一个或最后一个 ---
使用 str_replace
但这被前面有 space 的步骤挫败了!
总是时间之后的第二个---
,多行消息,或者前面的space 之前 ---
把我绊倒了。有没有人有比我正在创建的怪物更优雅的解决方案?
代码
-{3}.*[\s\S]*?(?=\s*(?:-{3}|$))
说明
-{3}
恰好匹配连字符 3 次
.*
匹配任意字符任意次数(贪心)
[\s\S]*?
匹配任何字符任意次数,但尽可能少(懒惰)
(?=\s*(?:-{3}|$))
正向前瞻确保后续匹配
\s*
匹配任意数量的空白字符
(?:-{3}|$)
匹配以下任意一项
-{3}
恰好匹配连字符 3 次
$
断言行尾的位置
/---.*---\s*\R.*(?=---|$)/gsU
---.*---\s*\R
- 选择带有消息描述的第一行。比 .*(?=---|$)
获取消息的其余部分直到下一条 (---) 的开头或字符串的结尾。
我在处理复杂的正则表达式时遇到问题。我已经尝试了所有我能想到的方法,但我总是只能得到 "almost" --
我有 5 条消息:
---Agent 1: Wednesday 08/16/2017 | 11:43 AM ---
Message 1
--- Agent 1: Friday 06/09/2017 | 9:02 AM ---
Message 2
--- Agent 1: Friday 04/14/2017 | 10:35 AM ---
Message 3
--- Agent 1: Monday 02/13/2017 | 12:07 AM ---
This
is
message
3
--- Agent 1: Monday 12/19/2016 | 1:31 PM ---
Message 4
--- Agent 1: Monday 10/24/2016 | 10:48 AM ---
Message 5
一个问题是其中一些在第一个 ---
之前有一个 space。另一个是多行消息。
我想做的是剥离所有单独的消息。基本上是 ---
第一次出现和此后每隔一次出现之间的所有内容。我希望我的 结果 看起来像:
---Agent 1: Wednesday 08/16/2017 | 11:43 AM ---
Message 1
我尝试了 ---.*? (---)
的变体(相互匹配 ---
)但是我无法解析消息本身。我也尝试过手动执行此操作:
(?<=\: )(.*?)(?= \|)|(\---)(\r\n|\r|\n)(\r\n|\r|\n)(.*?)(\r\n|\r|\n)(\r\n|\r|\n)(\---)
在您收到多行消息之前,该方法一直有效。 (消息 3)
我也尝试了多个步骤 -- trimming
第一个或最后一个 ---
使用 str_replace
但这被前面有 space 的步骤挫败了!
总是时间之后的第二个---
,多行消息,或者前面的space 之前 ---
把我绊倒了。有没有人有比我正在创建的怪物更优雅的解决方案?
代码
-{3}.*[\s\S]*?(?=\s*(?:-{3}|$))
说明
-{3}
恰好匹配连字符 3 次.*
匹配任意字符任意次数(贪心)[\s\S]*?
匹配任何字符任意次数,但尽可能少(懒惰)(?=\s*(?:-{3}|$))
正向前瞻确保后续匹配\s*
匹配任意数量的空白字符(?:-{3}|$)
匹配以下任意一项-{3}
恰好匹配连字符 3 次$
断言行尾的位置
/---.*---\s*\R.*(?=---|$)/gsU
---.*---\s*\R
- 选择带有消息描述的第一行。比 .*(?=---|$)
获取消息的其余部分直到下一条 (---) 的开头或字符串的结尾。