c++ - 如何在 Qt 正则表达式中模拟负向后断言?

标签 c++ regex qt

我正在使用 Qt 4.6 编写一个程序,我需要从表达式中捕获所有出现的非范围文字,例如 "SUM(A1:A3)+B1-B3+SUM(D1:D3)/COUNT(D1:D3)" , 即 B1、B3,但不是 A1、A3、D1、D3。我尝试使用 QRegExp,但它不支持负后向断言,因此我无法排除 A3、D3 等文字。 我的正则表达式 (?<!:)([A-Z]{1,4}[1-9]\\d{0,3})(?!:)不起作用。 我需要你的意见。谢谢。

最佳答案

根据您的情况,您可以使用

(?:^|[^:])\b([A-Z]{1,4}[1-9]\d{0,3})\b(?!:)

第一组匹配开头的空字符串或除冒号之外的任何字符。我还添加了单词边界 \b,以便模式不会匹配 A4a 等内容。

通常,编写“积极”模式会更简单。例如,使用

(...)(:...)?

使用 ... 表示匹配单元格引用的 [A-Z] 模式,您可以一次性匹配范围和非范围,然后在循环时丢弃所有范围超过结果。您可以通过检查第二个捕获组是否为空来轻松检测匹配是否为范围。

关于c++ - 如何在 Qt 正则表达式中模拟负向后断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407022/

相关文章:

javascript - 正则表达式提取html注释属性

php - 带下划线正则表达式模式的字母数字

c++ - 为什么discard的参数是unsigned long long类型的?

c++ - 删除字符矩阵

php - 使用 php 正则表达式解析 block

qt - 在 JSON 中编码 QString

c++ - 将 "Program Files"设置为 Qt Installer Framework 中的默认安装目录

linux - 如何在 KDE Plasma 上使用两个 Qt5 版本以避免冲突?

c++ - Valgrind: "Invalid read"与 c_str 和 strtod

c++ - glUseProgram() 和 glUseShaderProgram() 有什么区别?