问题
最近在做一个控制台的程序,程序提供给用户几个命令。每个命令都可以接受多个参数,参数可以有值也可以没值。另外,如若参数中有空格则可用双引号(“”)把参数括起来以表示是一个整体。一些简单的命令例子如下:
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):
从图片中可以看出,命令名和各参数块都被正确的识别出。
接下来的一个重要任务是如何解析各参数名字和参数的值。首先,解析参数名字。这个相对比较简单,因为参数都是以“/”开头的,因此表达式如下:
/\s*(".+?"|[^:\s])+(?=[:\s])
对前述示例命令的测试结果如下:
从图片中看出,各参数的名字都被正确解析出。
有了参数的名字,则剩余部分为参数的值(注意,需要去掉分隔符“:”)。
结论
处理(查找,匹配,替换等)复杂字符串时,正则表达式有其无可替代的优势。在应用程序中正确的应用正则表达式可以减少代码量并减少错误发生的几率。