繁体   English   中英

正则表达式:仅返回消息字符串 - 以父消息大括号之间的消息和字符串开头

[英]Regex: Only returns message string - That's starts with messages and string between parent message curly brace

我只想获取所有消息数据。 这样它应该查找消息和父消息的花括号之间的所有数据。 使用以下代码,我也获得了服务详细信息以及我不想要的消息。 提前感谢这位专家的任何建议。

String data = "/**\r\n" + 
        " * file\r\n" + 
        " */\r\n" + 
        "syntax = \"proto3\";\r\n" + 
        "package demo;\r\n" + 
        "\r\n" + 
        "import \"envoyproxy/protoc-gen-validate/validate/validate.proto\";\r\n" + 
        "import \"google/api/annotations.proto\";\r\n" + 
        "import \"google/protobuf/wrappers.proto\";\r\n" + 
        "import \"protoc-gen-swagger/options/annotations.proto\";\r\n" + 
        "\r\n" + 
        "option go_package = \"bitbucket.com;\r\n" + 
        "option java_multiple_files = true;\r\n" + 
        "\r\n" + 
        "schemes: HTTPS;\r\n" + 
        "consumes: \"application/json\";\r\n" + 
        "produces: \"application/json\";\r\n" + 
        "responses: {\r\n" + 
        "key:\r\n" + 
        "    \"404\";\r\n" + 
        "value: {\r\n" + 
        "description:\r\n" + 
        "    \"not exist.\";\r\n" + 
        "schema: {\r\n" + 
        "json_schema: {\r\n" + 
        "type:\r\n" + 
        "    STRING;\r\n" + 
        "}\r\n" + 
        "}\r\n" + 
        "}\r\n" + 
        "}\r\n" + 
        "responses: {\r\n" + 
        "key:\r\n" + 
        "    \"401\";\r\n" + 
        "value: {\r\n" + 
        "description:\r\n" + 
        "    \"Wrong user.\";\r\n" + 
        "schema: {\r\n" + 
        "json_schema: {\r\n" + 
        "type:\r\n" + 
        "    STRING;\r\n" + 
        "};\r\n" + 
        "example: {\r\n" + 
        "value:\r\n" + 
        "    '{ \"message\": \"wrong user.\" }'\r\n" + 
        "}\r\n" + 
        "}\r\n" + 
        "}\r\n" + 
        "}\r\n" + 
        "\r\n" + 
        "message message1 {\r\n" + 
        "    message message2 {\r\n" + 
        "        enum Enum {\r\n" + 
        "            UNKNOWN = 0;    \r\n" + 
        "        }\r\n" + 
        "    }\r\n" + 
        "    string id = 1;\r\n" + 
        "    string name = 3;\r\n" + 
        "    string account = 4;\r\n" + 
        "}\r\n" + 
        "\r\n" + 
        "message User{\r\n" + 
        "   string firstName = 1 ;\r\n" + 
        "   string lastName  = 2 ;\r\n" + 
        "   string middleName  = 3 [(validate.rules).repeated = { min_items: 0 }];\r\n" + 
        "}\r\n" + 
        "\r\n" + 
        "service Userlogin{\r\n" + 
        "   rpc Login(User) returns (APIResponse);\r\n" + 
        "}";
List<String> allmsg = Arrays.asList(data.replaceAll("(?sm)\\A.*?(?=message)", "").split("\\R+(?=message)"));

我期待在我的大小为 2 的字符串数组列表中得到如下响应。

allMsg.get(0) 应该是

message message1 {
    message message2 {
        enum Enum {
            UNKNOWN = 0;    
        }
    }
    string id = 1;
    string name = 3;
    string account = 4;
}

allMsg.get(1) 应该是

message User{
    string firstName = 1 ;
    string lastName  = 2 ;
    string middleName  = 3 [(validate.rules).repeated = { min_items: 0 }];
}

使用匹配“消息”的模式和 stream 匹配结果到列表:

List<String> allmsg = Pattern.compile("(?ms)^message.*?^}")
  .matcher(data)
  .results() // stream the MatchResults
  .map(MatchResult::group) // get the entire match
  .collect(toList()); // collect as a List

请参阅实时代码演示

正则表达式细分:

  • (?ms)打开标志s ,这使得点也匹配换行符,和m ,这使得^$匹配每行的开始和结束
  • ^message匹配一行的开头(不是输入的开头,多亏了m标志)然后是“message”
  • .*? 不情愿地(即尽可能少地)匹配任何字符(包括换行符,多亏了s标志)。 添加? 使量词勉强阻止匹配消耗多个“消息”。
  • ^}匹配一行的开头(不是输入的开头,多亏了m标志)然后是 "}"

请参阅实时正则表达式演示

即使“消息”彼此不连续,这也会起作用,即它们可能散布在其他构造中(您的示例没有这种情况,但链接的演示有)。

你应该看看你的其他问题

Pattern.compile("(?s)^message(.(?!message|service))*");

如果消息可以在消息之后出现

“消息消息 1 {\r\n” +

您必须调整正则表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM