正则表达式只是把这种风格从" "
Regex just get this style out off ""
你好,这是我在c++中的字符串
data1(" value 1 ") data2 ("value 2") anything3(" data3("value") ")
这是我的正则表达式
regex Rgx(R"~((w+)s*[(]s*["]([^"]*)["]s*[)])~");
我想使用c++正则表达式(搜索)并获得
data1
data2
anything3
和
value 1
value 2
data3("value")
但我的结果是
data1(" value 1 ")
data1
value 1
data2 ("value 2")
data2
value 2
data3("value")
data3
value
问题出在哪里?我希望这个正则表达式能把""
中的所有东西都去掉
我想更改此正则表达式以获得data3("value")
,但首先检查data3("value")
不在""
之间
在pcre中,我看到这个正则表达式可以传递的所有"内部"
h*(.*?)h*[(]h*"(.*?(?:[\\]".*?)*)"[)]h*([,|.*?])
这是的工作
key1("val1"), key2("val2"), key3(" key4("val3") ret "),
你可以检查这个结果
0 => array(
0=>key1("val1"),
1=> key2("val2"),
2=> key3(" key4("val3") ret "),
)
1 => array(
0=>key1
1=>key2
2=>key3
)
2 => array(
0=>val1
1=>val2
2=> key4("val3") ret
)
我需要这样的东西来跳过""
内的所有""
您要查找的是regex递归。C++的regex
引擎(ECMAScript)不支持这一点。因此,如果你要在C++中解析一个具有递归的字符串,你要么需要Boost,要么必须手工完成。
由于我一直鼓励尽可能使用这种语言,我将向您展示如何在没有Boost的情况下做到这一点。
我们需要两个函数,第一个函数用于查找未转义的char
:
template <typename T>
T findNonEscaped(T start, T end, const char ch) {
T result = find(start, end, ch);
while (result != end && result[-1] == '') result = find(start, end, ch);
return result;
}
第二,我们需要一个这样的函数来提取嵌套的括号:
template <typename T>
T extractParenthesis(T start, T end) {
T finish = findNonEscaped(start, end, ')');
for (auto i = findNonEscaped(next(start), end, '('); i != end && i < finish; i = findNonEscaped(next(i), end, '(')) finish = findNonEscaped(next(finish), end, ')');
return finish;
}
最后,给定输入行:const auto input = "data1(" value 1 ") data2 ("value 2") anything3(" data3("value") ")"s;
,我们可以使用这两个函数来编写:
map<string, string> output;
for (auto openParenthesis = findNonEscaped(input.cbegin(), input.cend(), '('), closeParenthesis = input.cbegin(); openParenthesis != input.cend(); openParenthesis = findNonEscaped(openParenthesis, input.cend(), '(')) {
decltype(output)::key_type key;
istringstream ss{ string{ make_reverse_iterator(openParenthesis), make_reverse_iterator(closeParenthesis) } };
ss >> key;
closeParenthesis = extractParenthesis(openParenthesis, input.cend());
output[decltype(output)::key_type{ key.crbegin(), key.crend() }] = decltype(output)::mapped_type{ next(findNonEscaped(next(openParenthesis), closeParenthesis, '"')), prev(findNonEscaped(make_reverse_iterator(closeParenthesis), make_reverse_iterator(next(openParenthesis)), '"').base()) };
openParenthesis = closeParenthesis;
}
实时示例
这个代码非常有弹性,我所知道的唯一缺陷是,对于像const auto input = "key1("value1""value2")"
这样的无效输入,它将返回:
key1:value1"value2
我知道这个迭代器的一些功能有点。。。先进的所以,如果你有具体的问题,请随时在评论中告诉我。
相关文章:
- 使用正则表达式regex_search在字符串中查找字符串
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++正则表达式无限循环
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 带有多个字符分隔符的正则表达式
- C++ 使用增强正则表达式库时断言崩溃
- 有人可以帮助我处理正则表达式吗?
- 使用正则表达式获取大括号块的列表
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 组合正则表达式部分使用 | 不起作用的 C++
- 为什么C++正则表达式这么慢?
- 如何使HTML5电子邮件验证正则表达式在C++中工作?
- 在C++中实现正则表达式
- C++正则表达式替换整个单词
- 用C++编写正则表达式的正确方法是什么?
- 如何从Stroustrup的C++书中解释这个正则表达式?
- 为什么这个正则表达式C++在括号表达式中抛出无效范围异常?
- C++:匹配正则表达式,什么是匹配?
- 正则表达式只是把这种风格从" "