正则表达式识别MQTT主题

时间:2018-02-23 11:33:09

标签: c# regex

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

  1. 坎德拉/ HL /项目/ {PROJECT_ID} /变种/ {VAR_NAME}
  2. 坎德拉/ HL /项目/ {PROJECT_ID} /变种/ {VAR_NAME} /写
  3. {project_id}可以是任何字符,但换行符(\ n)。可以是空的 {var_name}可以是任何字符,但换行符(\ n)。可以是空的

    匹配字符串2我使用以下内容,它在我测试的所有情况下都有效:

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

    到目前为止一切顺利。但是当我尝试匹配时,我失败了,而且还没有给出匹配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 个答案:

答案 0 :(得分:0)

子部分不应包含/,而不仅仅是\n。您应该将.*替换为[^/\n]*并使用

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

请参阅regex demo 1regex demo 2

[^/\n]* negated character class匹配除*/以外的任何0+(由于\n)字符。