我想在单个字符串参数中拆分类似字符串的命令行.如何查看正则表达式.问题是参数可以引用.例如:
"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)
现在告诉我,破坏你的大脑关于正则表达式如何解决这个问题是值得的麻烦.
我倾向于使用regexlib来解决这类问题.如果您访问:http://regexlib.com/并搜索"命令行",您将找到三个结果,看起来他们正在尝试解决此问题或类似问题 - 应该是一个良好的开端.
这可能有效:http: //regexlib.com/Search.aspx?k = command + line&c = -1&m = -1&ps = 20
("[^"]+"|[^\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)
不考虑实现语言,你的正则表达式看起来像这样:
("[^"]*"|[^"]+)(\s+|$)
Run Code Online (Sandbox Code Playgroud)
第一部分"[^"]*"
查找不包含嵌入引号的带引号的字符串,第二部分[^"]+
查找一系列非引号字符.所述\s+
匹配的空间分离序列,和$
所述字符串的末尾匹配.
归档时间: |
|
查看次数: |
36283 次 |
最近记录: |