我有以下字符串:

NoticeText:
    NoticeType [str] = USER_TYPING_ON
    Text [str] = "user is typing"
    EventInfo:
        PartyId [int] = 2
        EventType [str] = MESSAGE
        UserNickname [str] = "Michael"
        EventId [int] = 4
        Text [str] = "Hey, how are you?"
        MsgCheck [str] = NONE
        TimeOffset [int] = 23
        UserType [str] = AGENT
NoticeText:
    NoticeType [str] = USER_TYPING_ON
    EventInfo:
    PartyId [int] = 1
        EventType [str] = MESSAGE
        UserNickname [str] = "Bob Smith"
        EventId [int] = 6
        Text [str] = "I'm good, how are you?"
        MsgCheck [str] = NONE
        TimeOffset [int] = 28
        UserType [str] = CLIENT
        MessageType [str] = "text"


我需要能够检索“我很好,你好吗?”的句子。我完全陷入了困境。

我试图在“文本[str] =“之后检索短语,这会返回我所需的内容。但是它还会在“文本[str] =“之后”返回所有其他句子。

一个可能对你们有用的技巧是PartyId [int]字段。 1对应于客户端。我需要那个人的信息。

我只是不知道该如何缩小范围。

请帮忙!

最佳答案

描述

^NoticeText:(?:(?!\nNoticeText:).)*\n\s+EventInfo(?:(?!\nNoticeText:).)*\n\s+Text\s*\[str\]\s*=\s*"([^"]*)"(?:(?!\nNoticeText:).)*\nNoticeText:(?:(?!\nNoticeText:).)*\n\s+EventInfo(?:(?!\nNoticeText:).)*\n\s+Text\s*\[str\]\s*=\s*"([^"]*)"(?:(?!\nNoticeText:).)*



**要更好地查看图像,只需右键单击图像并在新窗口中选择视图



现场演示

https://regex101.com/r/tD6uV9/1

示例文本

NoticeText:
    NoticeType [str] = USER_TYPING_ON
    Text [str] = "user is typing"
    EventInfo:
        PartyId [int] = 2
        EventType [str] = MESSAGE
        UserNickname [str] = "Michael"
        EventId [int] = 4
        Text [str] = "Hey, how are you?"
        MsgCheck [str] = NONE
        TimeOffset [int] = 23
        UserType [str] = AGENT
NoticeText:
    NoticeType [str] = USER_TYPING_ON
    EventInfo:
    PartyId [int] = 1
        EventType [str] = MESSAGE
        UserNickname [str] = "Bob Smith"
        EventId [int] = 6
        Text [str] = "I'm good, how are you?"
        MsgCheck [str] = NONE
        TimeOffset [int] = 28
        UserType [str] = CLIENT
        MessageType [str] = "text"


比赛样本


捕获组0同时获得两个NoticeText
捕获组1在第一个Text [str]中的EventInfo之后获得第一个NoticeText
捕获组2在第二个Text [str]中的PartyID之后获得第二个NoticeText


MATCH 1
Capture Group 1.    [246-263]   `Hey, how are you?`
Capture Group 2.    [566-588]   `I'm good, how are you?`


说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  NoticeText:              'NoticeText:'
----------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
      \n                       '\n' (newline)
----------------------------------------------------------------------
      NoticeText:              'NoticeText:'
----------------------------------------------------------------------
    )                        end of look-ahead
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )*                       end of grouping
----------------------------------------------------------------------
  \n                       '\n' (newline)
----------------------------------------------------------------------
  \s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  EventInfo                'EventInfo'
----------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
      \n                       '\n' (newline)
----------------------------------------------------------------------
      NoticeText:              'NoticeText:'
----------------------------------------------------------------------
    )                        end of look-ahead
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )*                       end of grouping
----------------------------------------------------------------------
  \n                       '\n' (newline)
----------------------------------------------------------------------
  \s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  Text                     'Text'
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  \[                       '['
----------------------------------------------------------------------
  str                      'str'
----------------------------------------------------------------------
  \]                       ']'
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  =                        '='
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  "                        '"'
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [^"]*                    any character except: '"' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  "                        '"'
----------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
      \n                       '\n' (newline)
----------------------------------------------------------------------
      NoticeText:              'NoticeText:'
----------------------------------------------------------------------
    )                        end of look-ahead
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )*                       end of grouping
----------------------------------------------------------------------
  \n                       '\n' (newline)
----------------------------------------------------------------------
  NoticeText:              'NoticeText:'
----------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
      \n                       '\n' (newline)
----------------------------------------------------------------------
      NoticeText:              'NoticeText:'
----------------------------------------------------------------------
    )                        end of look-ahead
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )*                       end of grouping
----------------------------------------------------------------------
  \n                       '\n' (newline)
----------------------------------------------------------------------
  \s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  EventInfo                'EventInfo'
----------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
      \n                       '\n' (newline)
----------------------------------------------------------------------
      NoticeText:              'NoticeText:'
----------------------------------------------------------------------
    )                        end of look-ahead
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )*                       end of grouping
----------------------------------------------------------------------
  \n                       '\n' (newline)
----------------------------------------------------------------------
  \s+                      whitespace (\n, \r, \t, \f, and " ") (1 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  Text                     'Text'
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  \[                       '['
----------------------------------------------------------------------
  str                      'str'
----------------------------------------------------------------------
  \]                       ']'
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  =                        '='
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  "                        '"'
----------------------------------------------------------------------
  (                        group and capture to \2:
----------------------------------------------------------------------
    [^"]*                    any character except: '"' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of \2
----------------------------------------------------------------------
  "                        '"'
----------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
      \n                       '\n' (newline)
----------------------------------------------------------------------
      NoticeText:              'NoticeText:'
----------------------------------------------------------------------
    )                        end of look-ahead
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )*                       end of grouping
----------------------------------------------------------------------




或者

如果这些NoticeText块的列表很长,则可以使用同一表达式的简化版本将它们全部解析。

^NoticeText:(?:(?!\nNoticeText:)[\s\S])*\n\s+Text\s*\[str\]\s*=\s*"([^"]*)"(?:(?!\nNoticeText:)[\s\S])*



在此版本中,我正在使用全局标志和多行标志



从上方使用相同的示例文本,捕获组0将获得单个NoticeText,捕获组1仅将块中的最后一个Text [str]

比赛样本

MATCH 1
Capture Group 1.    [246-263]   `Hey, how are you?`

MATCH 2
Capture Group 1.    [566-588]   `I'm good, how are you?`


现场演示

https://regex101.com/r/uW6cV6/1

08-06 21:11