正则表达式处理子串不同

时间:2017-12-07 10:39:44

标签: regex

我有以下正则表达式来检查伪函数调用的语法:

(\$[^\W]+\$)

因此,如果我有路径或其他东西,我可以检查包含函数调用的语法是否有效。

函数调用始终以$ -char开始和结束。

要验证路径的语法,我有以下与完整路径匹配的正则表达式:

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

我尝试将这两个正则表达式与 | 结合使用,但是每个与路径语法匹配的函数调用都是有效的。

我需要一个检查路径语法的正则表达式,如果有一个函数调用(前导和结束$),应该检查函数调用语法。

有效字符串

  • C:\ TEMP \ testfolder \
  • C:\ $ getTempPath $ \ testfolder \
  • C:\ $ getTempPath $ \ $ getTestFolder $ \
  • C:\ programms(x86)\ $ getAppFolder $ \
  • C:\ temp \ alternative $文件夹名称(对于用户)\

无效字符串

  • C:\ $ getPrograms(86)$ \ testfolder \
  • C:\ $ my function $ \ test \

2 个答案:

答案 0 :(得分:1)

您可以使用

^(?!.*\\\$\w*[^\w\\][^\\]*\$(?:\\|$))(?:[A-Za-z]:|[\\.])(?:\\[^\\\/:*?"<>|]*)+\\$

请参阅regex demo

主要思想是使包含以$开头的子路径的任何字符串失败,然后包含除\之外的任何非字char(dir分隔符,这可能需要调整),以及然后有\以外的任何数量的字符,最多为$\或字符串的结尾。

<强>详情

  • ^ - 字符串开头
  • (?!.*\\\$\w*[^\w\\][^\\]*\$(?:\\|$)) - 如果模式从字符串的开头直接匹配到右边,则会导致匹配失败:
    • .* - 除了换行符之外的任何0 +字符,尽可能多
    • \\\$ - \$子字符串
    • \w* - 0+ word chars
    • [^\w\\] - 除了单词和\字符
    • 之外的任何字符
    • [^\\]* - 除\ char
    • 以外的0个字符
    • \$ - $字符
    • (?:\\|$) - \或字符串结尾
  • (?:[A-Za-z]:|[\\.]) - ASCII字母和:之后,或\.
  • (?:\\[^\\\/:*?"<>|]*)+ - 出现1次或多次:
    • \\ - \字符
    • [^\\\/:*?"<>|]* - 除了字符类
    • 中定义的字符以外的0个字符
  • \\ - \字符
  • $ - 字符串结束。

答案 1 :(得分:0)

如果稍微调整一下,WiktorStribiżew提供的正则表达式可能会有效:

^(?:[A-Za-z]:|[\\.])(?:\\(?:\$\w+\$|(?!\$[^\\\/:*?"<>|]+\$\\)[^\\\/:*?"<>|]+))+\\$

变化是:

  1. 允许路径名中的$字符
  2. 添加负前瞻表达式以防止它允许$字符包围路径名