c++ - 正则表达式 - 匹配后面没有特定模式的字符

标签 c++ regex regex-negation

我想要一个正则表达式(尽可能高效,因为我使用 C++ 并且引擎效率不高)来匹配任何包含 % 且后面不立即跟随的字符串:

1) 一个字母 [a-zA-Z]

2) .NUMBERS[a-zA-Z]

3) 数字[a-zA-Z]

所以我想匹配这样的字符串:“dsfdf (%) dsfgs %d s32523”,“%d %d % %t dsg”

我不想匹配这样的字符串:“sfsf %d”,“dfsd %.464d,%353T”

最佳答案

使用negative look-ahead expression :

Negative lookahead is indispensable if you want to match something not followed by something else: q(?!u) means q not followed by u

就您而言q% ,和u([.]?[0-9]+)?[a-zA-Z] (可选点的可选前缀,后跟一个或多个数字以及字母后缀)。

Demo 1

注意:此表达式使用 +在前瞻部分中,该功能没有得到普遍支持。如果您的正则表达式引擎不接受它,请通过替换 [0-9]+ 设置人为限制,例如 20 位数字。与 [0-9]{1,20} .

编辑:

What about writing my own parser?

如果您需要这个相对简单的正则表达式的终极速度,请使用手写解析器。这是一个简单的例子:

for (string str ; getline(cin, str) ; ) {
    bool found = false;
    size_t pos = 0;
    while (!found && (pos = str.find('%', pos)) != string::npos) {
        if (++pos == str.size()) {
            found = true;
            break;
        }
        if (str[pos] == '.') {
            if (++pos == str.size()) {
                found = true;
                break;
            }
            if (!isdigit(str[pos])) {
                found = true;
                break;
            }
        }
        while (isdigit(str[pos])) {
            if (++pos == str.size()) {
                found = true;
                break;
            }               
        }
        found |= !isalpha(str[pos]);
    }
    cout << '"' << str << '"' << " : " << found << endl;
}

Demo 2

关于c++ - 正则表达式 - 匹配后面没有特定模式的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45033222/

相关文章:

c++ - Qt 在 QTextBrowser 中的 QVector<T>::operator[]: "index out of range"中抛出 ASSERT 失败

JavaScript Regex - 匹配包含一些字符但不包含其他字符的字符串

java - 如何否定包含范围的正则表达式?

javascript - 仅从域+TLD 组合中分割域

php - preg_replace 和中文字符的奇怪问题

php - 使用一个正则表达式在多行注释中查找单词

c++ - 如何在 Linux 上强制执行 vector 下标超出范围调试断言

c++ - 是否可以使用 ifstream 在 linux 中读取 dos 文件

c++ - 如何在 CLion 中将外部 C++ 库与 Bazel 一起使用?

C# 正则表达式拆分为 Java 模式拆分