匹配子字符串并转义特殊字符

时间:2017-12-18 09:12:07

标签: regex xsd

我有以下正则表达式来验证所谓的宏调用的语法:

(\b\$[A-Za-z:]*\$\b)

我有以下正则表达式来匹配文件夹路径:

^(?:[A-Za-z]{1}:\\|[\\]{2}|[A-Za-z])(?:[^\\\/:*?"<>|]*)+\\$

现在我有两个要求:

  1. 我需要检查以下特殊字符集是否仅显示为掩码:= " ' / # , $掩码是#-char。因此=仅在#=显示时才允许{。}}。
  2. 我想加入上面的两个正则表达式。因此,我有一个路径的正则表达式,其中每个特殊字符都被#符号掩盖。如果出现宏,我想检查宏语法。
  3. 宏总是在未屏蔽的$字符之间。

    有效示例:

      

    C:\ TEMP \测试\

         

    \\文件服务器\生产#$ \用户\

         

    d:\ $ FindDirectory $ \为approot \

         

    C:\ $ FindDirectory $ \ pathwith#$美元\

         

    C:\ $ findroot:appuser $ \ Test with equal#= 123 and hashtag ## \

         

    无效示例:( - &gt;有原因)

         

    C:\ temp \ test -> no ending \

         

    \\ fileserver \ production $ \ users \ -> not masked $

         

    C:\ $ FindDirectory1 $ \ approot \ -> invalid char (1) in macro-call

    不幸的是我对正则表达式不是很熟悉......

    上下文:

    在我的应用程序中,我有一个编辑器,用户可以在其中提供基于xml的输入。在这个输入中,他可以定义所谓的宏,然后他可以使用它。

    所以场景可以是:

    1. 他定义了一个宏来获取某个文件夹路径,并将其命名为“getAppFolder”
    2. 他想为复制动作定义一个路径,他想要使用他之前定义的宏(例如C:\ programs \ $ getAppFolder $ \ appdir)
    3. 将数据推送到自定义输出格式,其中必须转义上述特殊字符,以便另一个应用程序(不是由我编写)可以解释该输入数据
    4. 刚刚收到另一个案例,我忘记了

      宏调用也可以在字符串的开头,如:

      $ getFolderPath:根$ \ APPDIR \

      我已将coladict提供的解决方案修改为以下内容:

      ^(?:(?:(\$[A-Za-z0-9:.]*\$)|(?:#[="'#,\$]|[^#$])*))+$

      唯一缺少的是无效的路径字符,如\ /:*? “&lt;&gt;无法识别,C:\temp\hello<world之类的内容匹配(但不应匹配)

1 个答案:

答案 0 :(得分:1)

我设法制作了一个匹配所有给定示例的正则表达式并拒绝了无效示例,但您可能不同意它。

RegexPlanet上进行了测试。

in plain text: ^(?:[A-Za-z]:\\|\\{2})(?:(?:(\$[A-Za-z:]*\$)|[^\$](?:#[="'/#,\$]|[^#$])*[^\$]))+\\$
in C# string: "^(?:[A-Za-z]:\\\\|\\\\{2})(?:(?:(\\$[A-Za-z:]*\\$)|[^\\$](?:#[=\"'/#,\\$]|[^#$])*[^\\$]))+\\\\$"

从这部分你给出,试图匹配驱动器,我相信最后一段无效并删除它:

(?:[A-Za-z]{1}:\\|[\\]{2}|[A-Za-z])

现在这部分是:

(?:[A-Za-z]:\\|\\{2})

其余部分非常有趣,但是如何使用正则表达式#使用(?:#[="'/#,\$]|.)+进行转义的概念与示例C字符串解析器完全相同,我可以使用它。记住我找到的地方。