• 解析命令行的正则表达式


    问题

    最近在做一个控制台的程序,程序提供给用户几个命令。每个命令都可以接受多个参数,参数可以有值也可以没值。另外,如若参数中有空格则可用双引号(“”)把参数括起来以表示是一个整体。一些简单的命令例子如下:

    regularCommand argument /a: value  /b: value2   /argument:  value3
    regularCommand argument /a: value  /b: value2   /argument:  value3 /argumentWithouValue
    regularCommand /a:value /b:value2 anotherArgument /argument:value3
    commandWithSpaces "c:\Program files\application" /a: value /b:valu2 /c:"c:\windows\some folder"
    commandWithSingleQuote  "this is a 'test string' with 'single quote'"  /a:"%&*^@special arguments" /b:value2

    解决方法

    对于命令行字符的处理中,关键的一个问题是如何正确解析命令的名字,以及命令的每一个参数和值。对于这个任务,正则表达式能很好的完成,从而省去程序员大量的手动code解析的工作,而且手动code解析比较容易出错。经过长时间的分析及测试,我得出如下表达式:

    /\s*(".+?"|[^:\s])+((\s*:\s*(".+?"|[^\s])+)|)|(".+?"|[^"\s])+

    对前述示例命令行的测试结果如下 (测试工具RegExr):

    image

    从图片中可以看出,命令名和各参数块都被正确的识别出。

    接下来的一个重要任务是如何解析各参数名字和参数的值。首先,解析参数名字。这个相对比较简单,因为参数都是以“/”开头的,因此表达式如下:

    /\s*(".+?"|[^:\s])+(?=[:\s])

    对前述示例命令的测试结果如下:

    image

    从图片中看出,各参数的名字都被正确解析出。

    有了参数的名字,则剩余部分为参数的值(注意,需要去掉分隔符“:”)。

    结论

    处理(查找,匹配,替换等)复杂字符串时,正则表达式有其无可替代的优势。在应用程序中正确的应用正则表达式可以减少代码量并减少错误发生的几率。

  • 相关阅读:
    vue Ant Design 树形控件拖动限制
    defineProperty介绍及使用
    webpack 配置入门
    vscode 插件
    解决输入框自动填充账号密码的问题
    css 动画
    vue按钮权限控制
    git操作
    TCP和UDP的区别
    通信协议 HTTP TCP UDP
  • 原文地址:https://www.cnblogs.com/lsp/p/2157985.html
Copyright © 2020-2023  润新知