我遇到了复杂的正则表达式的问题。我已经尝试过每一种我能想到的方式,而且我总是只能“差不多” -
我有一条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
一个问题是其中一些在第一个---
之前有一个空格。另一种是多行消息。
我要做的是剥离所有个人信息。基本上是第一次出现---
和之后的每次出现之间的所有事情。我希望结果看起来像:
---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
,但这会被前面的空格挫败!
始终是时间之后的第二个---
,多行消息,或 ---
之前的前一个空格 。有没有人比我创造的怪物有更优雅的解决方案?
答案 0 :(得分:3)
/---.*---\s*\R.*(?=---|$)/gsU
---.*---\s*\R
- 选择带有消息说明的第1行。比.*(?=---|$)
得到消息的其余部分直到下一个(---)的开头或字符串的结尾。
答案 1 :(得分:2)
-{3}.*[\s\S]*?(?=\s*(?:-{3}|$))
-{3}
正好匹配连字符3次.*
任意次数匹配(贪婪)[\s\S]*?
任意次数匹配任何字符,但尽可能少(懒惰)(?=\s*(?:-{3}|$))
确定后续匹配的正向前瞻
\s*
匹配任意数量的空白字符(?:-{3}|$)
匹配以下任一项
-{3}
正好匹配连字符3次$
断言行尾的位置