英文:
regex_replace replaces only one occurrence for some reason
问题
使用正则表达式,我执行了以下操作:
#include <iostream>
#include <regex>
using namespace std;
int main()
{
string parsed = regex_replace(
"import core\nimport io\n",
(regex) "(^|\\r|\\n|\\r\\n)(\\s*)import\\s(.*)\\n",
"#include \\"$3.h++\\"\\n");
cout << parsed << endl;
return 0;
}
我预期的输出应该是:
#include "core.h++"
#include "io.h++"
但实际输出是:
#include "core.h++"
import io
你出现问题的地方在于你的正则表达式没有匹配到第二个 "import" 语句。这是因为你的正则表达式只匹配了一个换行符后的 "import" 语句,而第二个 "import" 语句前面没有换行符,所以没有被匹配到。
要解决这个问题,你可以使用以下正则表达式:
(regex) "(\\s*)import\\s(.*)($|\\n)"
这个正则表达式会匹配所有的 "import" 语句,无论它们是否在行的开头或末尾,并且无论它们是否跟随换行符。这样,你就可以正确替换所有的 "import" 语句了。希望这可以帮助你解决问题。
英文:
With regex, I perform
#include <iostream>
#include <regex>
using namespace std;
int main()
{
string parsed = regex_replace(
"import core\nimport io\n",
(regex) "(^|\r|\n|\r\n)(\\s*)import\\s(.*)\n",
"#include \"$3.h++\"\n");
cout << parsed << endl;
return 0;
}
I expected the output to be:
#include "core.h++"
#include "io.h++"
but it actually was:
#include "core.h++"
import io
Where did I go wrong? Why does it only replace one occurance? Is my regex bad?
I've tried changing the match_flag_options from regex_constants, but to no avail
答案1
得分: 2
你的正则表达式有些过于复杂,可以简化为:
regex(R"(^\s*import\s+([^\s]+)\s*$)", std::regex_constants::multiline)
请注意,我们需要将 std::regex_constants::multiline
作为构造函数参数传递,以便 ^/$
匹配行的开头/结尾,而不是整个输入的开头/结尾。
(我对你的正则表达式进行了一些更改:
- 匹配 import 和后面单词之间的多个空格
- 允许 import 词后的空格(但不允许在该词内部有空格)
- 不需要匹配行尾字符(在替换中也不需要包括它们!)
- 使用 原始字符串字面值 语法,因此我们不需要对所有内容进行双重转义。)
英文:
Your regex is somewhat needlessly complicated, it could just be
regex(R"(^\s*import\s+([^\s]+)\s*$)", std::regex_constants::multiline)
Note that we need to pass in std::regex_constants::multiline
as a constructor parameter so that ^/$
match the start/end of lines rather than the start/end of the entire input.
(Some changes I've made to your regex:
- match multiple spaces between import and the word after
- allow spaces after the 'import' word (and disallow them within that word)
- no need to match end of line characters (no need to include them in the substitution either!)
- Use the raw string literal syntax so we don't need to double escape everything
)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论