Регулярное выражение для выбора строки из множества одинаковых строк (Строка без префикса)
Пусть есть массив входных строк:
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 шт):
Автор решения: 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'