代码之家  ›  专栏  ›  技术社区  ›  Yevheniy Tymchishin

识别MQTT主题的正则表达式

  •  3
  • Yevheniy Tymchishin  · 技术社区  · 7 年前

    我试图在C中获得一个正则表达式来解析mqtt主题,以了解我们在系统中定义的每个主题类型要执行的操作。我们必须区分两个主题:

    1. cd/hl/projects/{project\u id}/var/{var\u name}
    2. cd/hl/projects/{project\u id}/var/{var\u name}/write

    {project\u id}可以是除换行符(\n)以外的任何字符。可以为空 {var\u name}可以是除换行符(\n)以外的任何字符。可以为空

    为了匹配字符串2,我使用以下方法,并且它在我测试的所有情况下都有效:

        ^cd/hl/projects/.*/var/.*/write$
    

    到现在为止,一直都还不错。但当我尝试匹配1时,我失败了。也没有在2上进行匹配。使用以下正则表达式:

        ^(cd/hl/projects/.*/var/.*)(?!/write)$
    
        what I think should do (but it doesn't):
        (cd/hl/projects/.*/var/.*)  #match any projects and var_names
        (?!/write)                  #not match if /write appears
    

    问题是,我无法停止匹配最后有/写的字符串,例如:

        cd/hl/projects/4d69439d-8c13-4e83-9ed5-60659d953f9f/var/test_count_one/write
    

    我只想不匹配上面的字符串,而只匹配:

        cd/hl/projects/{project_id}/var/{var_name}
    

    我的问题是:我采取了正确的方法?我错过了什么?我怎样才能实现我的目标?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Wiktor Stribiżew    7 年前

    子部分应包含 / ,而不仅仅是 \n . 您应该更换 .* 具有 [^/\n]* 和使用

    REGEX 1: ^cd/hl/projects/([^/\n]*)/var/([^/\n]*)
    REGEX 2: ^cd/hl/projects/([^/\n]*)/var/([^/\n]*)/write$
    

    请参见 regex demo 1 regex demo 2 .

    这个 [^/\n]* negated character class 匹配任何0+(由于 * )除 / \n个 .