当前位置: 首页 > 知识库问答 >
问题:

Regex:从字符串[duplicate]中获取以{开头并以}结尾的消息的所有内容

欧旻
2023-03-14

我想从输入(proto文件)中获取所有消息块。我在下面写了regex方法,但regex模式不匹配。专家们有什么建议吗?提前谢谢。

// ^ = start of line
// message = match exact word
// . = any character 
// * = any no of time
// \s = A whitespace character
// } = ends with }

public String[] getMessages(String protoFile) {
        Pattern pattern = Pattern.compile("^message.*?\n\s}");
        Matcher matcher = pattern.matcher(protoFile);
        while (matcher.find()) {
            String str = matcher.group();
            System.out.println(str);
        }
        return null;
    }

我的原始文件,我作为字符串发送到上面的方法

 syntax = \"proto3\";\r\n" + 
            "package example;\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" + 
            "\r\n" + 
            "message MyMessage1 {\r\n" + 
            "  enum EnumAllowingAlias {\r\n" + 
            "    option allow_alias = true;\r\n" + 
            "    UNKNOWN = 0;\r\n" + 
            "    STARTED = 1;\r\n" + 
            "    RUNNING = 1;\r\n" + 
            " string account = 1;  \r\n" + 
            "  }\r\n" + 
            "}\r\n" + 
            "\r\n" + 
            "message MyMessage2 {\r\n" + 
            "  enum EnumNotAllowingAlias {\r\n" + 
            "    UNKNOWN = 0;\r\n" + 
            "    STARTED = 1;\r\n" + 
            "  }\r\n" + 
            "}\r\n" + 
            "\r\n" + 
            "service Service1 {   \r\n" + 
            "    rpc getDeatils() returns (details) {\r\n" + 
            "   }  \r\n" + 
            "}";

共有2个答案

司马狐若
2023-03-14

我可以用大括号提取消息名和相应的内容,如下所示:

    Pattern.compile("message[^\\}]*\\}");

注意:

  • ^-行首消除给定字符串中间的所有匹配项
  • *-是一个贪婪的量词,你总是要想什么能阻止它吞噬一切
蒋茂
2023-03-14

我怀疑你忘记激活DOTALL标志了。

在你的情况下,像这样的事情:

Pattern.compile("(?s)^message.*?\n\s}");

更新后,请检查此解决方案是否足够:

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

你可以使用一个在线的RegEx测试仪来验证你的模式,比如RegExPlanet。

 类似资料:
  • 我想得到所有的消息数据。这样它就应该在父消息的花括号之间查找消息和所有数据。有了下面的模式,我没有得到所有的父体。 在我的字符串数组列表中,我希望得到如下大小为2的响应。 应该是: 和应该是:

  • 我需要一个正则表达式来精确匹配在字符串开头或结尾设置的字符,并将它们替换为。注意:它不应该与该字符集的部分匹配,只有当它完整地出现时。 因此,如果我有,它应该返回。 如果我有,它应该只删除,而不是开头的,因为它不是整个,而是它的一部分。 我尝试的是: “AB”不应匹配,因为它们不是单独“AB”组,而是其他单词的一部分。

  • 我在记事本中加载了一个非常大的源代码文件,我试图使用它的regex搜索功能来查找所有使用属性的地方。 我需要找到设置属性<code>DESCR</code>的所有位置。我尝试只搜索没有正则表达式,但有太多的结果需要我筛选。我知道我正在寻找的代码要么以或

  • 问题内容: 我有一个看起来像这样的数组: 我如何仅获取以其开头的元素? 问题答案:

  • 问题内容: 在CSS中,如何选择所有元素开头和结尾的元素? 例如,我想选择并应用以下样式: 问题答案: 以下CSS3选择器将完成此工作: 该表示什么应该开始。 该表示什么应该结束。 本身可以用另一个属性替换,例如,应用于时(例如):

  • 本文向大家介绍如何从R中的字符串中提取开头,结尾或中间字符?,包括了如何从R中的字符串中提取开头,结尾或中间字符?的使用技巧和注意事项,需要的朋友参考一下 在文本分析中,我们可能想从单个字符串或字符串向量中提取字符。可能需要使用此提取来创建一个新的字符串,其中包含一些需要进一步分析的特定单词。我们可以借助stringr包的str_sub函数来做到这一点。 示例 请看以下字符串- 加载纵梁包- 让我