zoukankan      html  css  js  c++  java
  • 解析命令行的正则表达式

    问题

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

    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

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

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

    结论

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

  • 相关阅读:
    控制一个cell不可被移动到另外一个section中
    core data 手动修改 .xcodatamodeld 文件 和 po 生成的 模型类 注意事项
    stringByTrimmingCharactersInSet 取出string 前后空格
    项目架构简述
    nil NULL [NSNULL null]
    如何定义一个应用之间调用的ios 本地URL
    UITableView隐藏多余的分割线
    解决UItableView cell的间隔线 separatorStyle ( plain group 两种类型)
    模拟器 真机 测试 内存消耗 资源对比
    微服务架构:Eureka集群搭建
  • 原文地址:https://www.cnblogs.com/lsp/p/2157985.html
Copyright © 2011-2022 走看看