如何使用正则表达式解析命令行?

Hor*_*ux7 6 regex parsing

我想在单个字符串参数中拆分类似字符串的命令行.如何查看正则表达式.问题是参数可以引用.例如:

"param 1"param2"param 3"

应该导致:

param 1,param2,param 3

小智 14

您不应该使用正则表达式.编写解析器,或使用您的语言提供的解析器.

我不明白为什么我会为此而投票.这是如何在Python中完成的:

>>> import shlex
>>> shlex.split('"param 1" param2 "param 3"')
['param 1', 'param2', 'param 3']
>>> shlex.split('"param 1" param2 "param 3')
Traceback (most recent call last):
    [...]
ValueError: No closing quotation
>>> shlex.split('"param 1" param2 "param 3\\""')
['param 1', 'param2', 'param 3"']
Run Code Online (Sandbox Code Playgroud)

现在告诉我,破坏你的大脑关于正则表达式如何解决这个问题是值得的麻烦.

  • 绝对的废话.对于正则表达式来说,这是一个简单的问题,它与解析XML没有任何共同之处. (7认同)

Sam*_*rum 6

我倾向于使用regexlib来解决这类问题.如果您访问:http://regexlib.com/并搜索"命令行",您将找到三个结果,看起来他们正在尝试解决此问题或类似问题 - 应该是一个良好的开端.

这可能有效:http: //regexlib.com/Search.aspx?k = command + line&c = -1&m = -1&ps = 20


Ale*_*hel 6

("[^"]+"|[^\s"]+)
Run Code Online (Sandbox Code Playgroud)

我用什么 C++

#include <iostream>
#include <iterator>
#include <string>
#include <regex>

void foo()
{
    std::string strArg = " \"par   1\"  par2 par3 \"par 4\""; 

    std::regex word_regex( "(\"[^\"]+\"|[^\\s\"]+)" );
    auto words_begin = 
        std::sregex_iterator(strArg.begin(), strArg.end(), word_regex);
    auto words_end = std::sregex_iterator();
    for (std::sregex_iterator i = words_begin; i != words_end; ++i)
    {
        std::smatch match = *i;
        std::string match_str = match.str();
        std::cout << match_str << '\n';
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

"par   1"
par2
par3
"par 4"
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 5

不考虑实现语言,你的正则表达式看起来像这样:

("[^"]*"|[^"]+)(\s+|$)
Run Code Online (Sandbox Code Playgroud)

第一部分"[^"]*"查找不包含嵌入引号的带引号的字符串,第二部分[^"]+查找一系列非引号字符.所述\s+匹配的空间分离序列,和$所述字符串的末尾匹配.