正则表达式只是把这种风格从" "

Regex just get this style out off ""

本文关键字:风格 正则表达式      更新时间:2023-10-16

你好,这是我在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

我知道这个迭代器的一些功能有点。。。先进的所以,如果你有具体的问题,请随时在评论中告诉我。