std::regex,匹配字符串的开始/结束

新手上路,请多包涵

在 JS 正则表达式中,符号 ^$ 指定 字符串的开始和结束。并且只有 /m 修饰符(多行模式)它们匹配 行的开头和结尾- CR/LF 之前和之后的位置。

但在 std::regex /ECMAscript 模式符号 ^$ 总是匹配 行的开始和结束

std::regex 中有什么方法可以定义 字符串匹配点的开始和结束 吗?换句话说:支持 JavaScript 多行模式…

原文由 c-smile 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
1 个回答

TL;博士

  • MSVC: ^$ 已经匹配 的开头和结尾
  • C++17: 使用 std::regex_constants::multiline 选项
  • 其他编译器仅将字符串开头与 ^ 和字符串结尾与 $ 匹配,而无法重新定义它们的行为。

在所有 std::regex MSVC 和 C++17 之前的实现中, ^$ 匹配 字符串 的开头和结尾,而不是请参阅 此演示,该演示在 "1\n2\n3"^\d+$ 正则表达式中找不到任何匹配项。当您添加交替时(见下文), 有 3 个匹配 项。

但是,在 MSVC 和 C++17 中, ^$ 可能匹配 的开始/结束。

C++17

使用 std::regex_constants::multiline 选项。

MSVC 编译器

在 Visual Studio 的 C++ 项目中,以下

std::regex r("^\\d+$");
std::string st("1\n2\n3");
for (std::sregex_iterator i = std::sregex_iterator(st.begin(), st.end(), r);
    i != std::sregex_iterator();
    ++i)
{
    std::smatch m = *i;
    std::cout << "Match value: " << m.str() << " at Position " << m.position() << '\n';
}

将输出

Match value: 1 at Position 0
Match value: 2 at Position 2
Match value: 3 at Position 4

适用于 C++ 编译器的解决方法

std::regex 中没有 通用 选项可以使锚点与所有编译器的行首/行尾匹配。你需要用交替来模拟它:

 ^ -> (^|\n)
$ -> (?=\n|$)

请注意, $ 可以完全“模拟” (?=\n|$) (您可以在其中添加更多行终止符符号或符号序列,例如 ^ (?=\r?\n|\r|$) ),但是 --- ,您找不到 100% 的解决方法。

由于没有后视支持,您可能需要调整正则表达式模式的其他部分,因为 (^|\n) 比使用后视支持更频繁地使用捕获组。

原文由 Wiktor Stribiżew 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题