带有复杂字符串的regex / preg_match / str_replace问题

时间:2017-12-05 17:09:55

标签: php regex preg-match str-replace

我遇到了复杂的正则表达式的问题。我已经尝试过每一种我能想到的方式,而且我总是只能“差不多” -

我有一条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,但这会被前面的空格挫败!

始终是时间之后的第二个---,多行消息,或 ---之前的前一个空格 。有没有人比我创造的怪物有更优雅的解决方案?

2 个答案:

答案 0 :(得分:3)

/---.*---\s*\R.*(?=---|$)/gsU

---.*---\s*\R - 选择带有消息说明的第1行。比.*(?=---|$)得到消息的其余部分直到下一个(---)的开头或字符串的结尾。

Demo and a little explanation

答案 1 :(得分:2)

代码

See regex in use here

-{3}.*[\s\S]*?(?=\s*(?:-{3}|$))

说明

  • -{3}正好匹配连字符3次
  • .*任意次数匹配(贪婪)
  • [\s\S]*?任意次数匹配任何字符,但尽可能少(懒惰)
  • (?=\s*(?:-{3}|$))确定后续匹配的正向前瞻
    • \s*匹配任意数量的空白字符
    • (?:-{3}|$)匹配以下任一项
      • -{3}正好匹配连字符3次
      • $断言行尾的位置