【问题标题】:Retrieve string given search criteria. Brackets, quotations and more检索给定搜索条件的字符串。括号,报价和更多
【发布时间】:2016-10-29 15:02:13
【问题描述】:

我有以下字符串:

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"

我需要能够检索句子“我很好,你好吗?”。我完全被难住了。

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

PartyId [int], 字段可能对你们有所帮助。 1 对应于客户端。这是我需要的人的信息。

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

请帮忙!

【问题讨论】:

    标签: java regex string substring phrase


    【解决方案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 在第一个 NoticeText 中的 EventInfo 之后获取第一个 Text [str]
    • 捕获组 2 在第二个 NoticeText 之后获得第二个 Text [str] PartyID
    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

    【讨论】:

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