这似乎太宽泛了,无法回答。
您正在做的是解析输入,并将其转换为其他内容。您没有做的是查找/替换(否则您可以使用正则表达式)。
当然你可以做正则表达式做的事,但我不确定它能给你带来什么:
template <typename It, typename Out>
Out preprocess(It f, It l, Out out) {
namespace qi = boost::spirit::qi;
using boost::spirit::repository::qi::seek;
auto passthrough = [&out](boost::iterator_range<It> ignored, auto&&...) {
for (auto ch : ignored) *out++ = ch;
};
auto transform = [&out](std::string const& literal, auto&&...) {
for (auto ch : "someObject.find(\"~"s) *out++ = ch;
for (auto ch : literal) *out++ = ch;
for (auto ch : "\")"s) *out++ = ch;
};
auto pattern = qi::copy("\"~" >> (*~qi::char_('"')) >> '"');
qi::rule<It> ignore = qi::raw[+(!pattern >> qi::char_)] [passthrough];
qi::parse(f, l, -qi::as_string[pattern][transform] % ignore);
return out;
}
这种编写方式的好处是它可以与任何源迭代器一起使用:
for (std::string const input : {
R"(function foo(a, b) { var path = "~/1/2"; })",
})
{
std::cout << "Input: " << input << "\n";
std::string result;
preprocess(begin(input), end(input), back_inserter(result));
std::cout << "Result: " << result << "\n";
}
std::cout << "\n -- Or directly transformed stdin to stdout:\n";
preprocess(
boost::spirit::istream_iterator(std::cin >> std::noskipws), {},
std::ostreambuf_iterator<char>(std::cout));
看到Live On Coliru,打印输出:
Input: function foo(a, b) { var path = "~/1/2"; }
Result: function foo(a, b) { var path = someObject.find("~/1/2"); }
-- Or directly transformed stdin to stdout:
function bar(c, d) { var path = someObject.find("~/1/42"); }
但这非常有限,因为如果这些东西是 cmets 或 multiline strings 等的一部分,它甚至不会做正确的事情。
因此,您可能需要一个专门的库,该库知道如何解析 javascript 并使用它来进行转换,例如(谷歌搜索时的第一个命中 tooling library preprocess javascript transform):https://clojurescript.org/reference/javascript-library-preprocessing