[英]Regex: starts with messages and string between parent message curly brace
[英]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.