在 JS 正则表达式中,符号 ^
和 $
指定 字符串的开始和结束。并且只有 /m
修饰符(多行模式)它们匹配 行的开头和结尾- CR/LF 之前和之后的位置。
但在 std::regex /ECMAscript 模式符号 ^
和 $
总是匹配 行的开始和结束。
std::regex 中有什么方法可以定义 字符串匹配点的开始和结束 吗?换句话说:支持 JavaScript 多行模式…
原文由 c-smile 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 JS 正则表达式中,符号 ^
和 $
指定 字符串的开始和结束。并且只有 /m
修饰符(多行模式)它们匹配 行的开头和结尾- CR/LF 之前和之后的位置。
但在 std::regex /ECMAscript 模式符号 ^
和 $
总是匹配 行的开始和结束。
std::regex 中有什么方法可以定义 字符串匹配点的开始和结束 吗?换句话说:支持 JavaScript 多行模式…
原文由 c-smile 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答1.1k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
4 回答792 阅读
1 回答869 阅读
1 回答899 阅读
1 回答668 阅读
1 回答776 阅读
TL;博士
^
和$
已经匹配 行 的开头和结尾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++ 项目中,以下
将输出
适用于 C++ 编译器的解决方法
std::regex
中没有 通用 选项可以使锚点与所有编译器的行首/行尾匹配。你需要用交替来模拟它:请注意,
$
可以完全“模拟”(?=\n|$)
(您可以在其中添加更多行终止符符号或符号序列,例如^
(?=\r?\n|\r|$)
),但是---
,您找不到 100% 的解决方法。由于没有后视支持,您可能需要调整正则表达式模式的其他部分,因为
(^|\n)
比使用后视支持更频繁地使用捕获组。