Регулярное выражение для выбора строки из множества одинаковых строк (Строка без префикса)

Пусть есть массив входных строк:

s = ["NT LANMAN", "LANMAN", "DOS LANMAN", PC NETWORK PROGRAM""]

Необходимо выбрать при помощи регулярного выражения все строки, Содержащие слово "LANMAN", но не содержащие словосочетание "NT LANMAN"

Я уже попробовал:

(?!NT\s*)LANMAN - не подходит.

[^Nn][^Tt]\s*LANMAN - тоже.

(?!NT\s*LANMAN\s*)LANMAN - тоже.

Протестить можно тут: https://regex101.com/r/B5zf9O/1

Программа для проверки тут: https://wandbox.org/permlink/gwi7TwRtMVEiRmFV


Ответы (2 шт):

Автор решения: dresser

Попробуйте этот вариант - /(?<!NT\s)LANMAN/x

→ Ссылка
Автор решения: Wiktor Stribiżew

Используйте

check_match(R"(^(?!.*\bNT LANMAN\b).*\blanman\b)", s, n);

Подробности:

  • ^ - начало строки
  • (?!.*\bNT LANMAN\b) - сразу после начала строки не должно быть ноль и более символов, отличных от перевода строки, как можно больше, а потом целого слова NT LANMAN
  • .* - ноль и более символов, отличных от перевода строки, как можно больше
  • \blanman\b - целое слово lanman

См. пример работы регулярного выражения.

Пример кода:

#include <iostream>
#include <string>
#include <regex>

using namespace std;

std::string s[] = {
    "PC NETWORK PROGRAM 1.0",
    "NT LM 0.12", 
    "NT LANMAN",
    "LANMAN",
    "LM",
    "DOS LANMAN"
};

void check_match(const std::string& r, const std::string* s, size_t n)
{
    std::regex re(r, std::regex_constants::icase);
    std::smatch m;
    
    for(size_t i = 0; i < n; i++)
    {
        bool res = std::regex_search(s[i], m, re);
        cout << "  regex: '" << r << "' is " 
             << (res ? " match" : "not match")
             << ", string: '" << s[i] << "' "
             << ", m: '" << (res ? m[0].str() : "" ) << "'" << endl;
    }
    
    cout << endl;
}

int main()
{
    size_t n = sizeof(s) / sizeof(std::string);
    check_match(R"(^(?!.*\bNT LANMAN\b).*\blanman\b)", s, n);
}

Результат:

regex: '^(?!.*\bNT LANMAN\b).*\blanman\b' is not match, string: 'PC NETWORK PROGRAM 1.0' , m: ''
regex: '^(?!.*\bNT LANMAN\b).*\blanman\b' is not match, string: 'NT LM 0.12' , m: ''
regex: '^(?!.*\bNT LANMAN\b).*\blanman\b' is not match, string: 'NT LANMAN' , m: ''
regex: '^(?!.*\bNT LANMAN\b).*\blanman\b' is  match, string: 'LANMAN' , m: 'LANMAN'
regex: '^(?!.*\bNT LANMAN\b).*\blanman\b' is not match, string: 'LM' , m: ''
regex: '^(?!.*\bNT LANMAN\b).*\blanman\b' is  match, string: 'DOS LANMAN' , m: 'DOS LANMAN'
→ Ссылка