Регулярное выражение для строки совпадения с символом новой строки

Как использовать регулярное выражение для сопоставления в текстовой парольной фразе между Passphrase= строка и \n char (выберите: testpasssword)? Пароль может содержать любые символы.

Мое частичное решение: Passphrase.*(?=\\nName) => Passphrase=testpasssword

[wifi_d0b5c2bc1d37_7078706c617967726f756e64_managed_psk]\nPassphrase=testpasssword\nName=pxplayground\nSSID=9079706c697967726f759e69\nFrequency=2462\nFavorite=true\nAutoConnect=true\nModified=2018-06-18T09:06:26.425176Z\nIPv4.method=dhcp\nIPv4.DHCP.LastAddress=0.0.0.0\nIPv6.method=auto\nIPv6.privacy=disabled\n

2 ответа

Решение

С QRegularExpression который поддерживает синтаксис регулярных выражений PCRE, вы можете использовать

QString str = "your_string";
QRegularExpression rx(R"(Passphrase=\K.+?(?=\\n))");
qDebug() << rx.match(str).captured(0);

Посмотреть демо-версию регулярного выражения

R"(Passphrase=\K.+?(?=\\n))" является необработанным строковым литералом, определяющим Passphrase=\K.+?(?=\\n) шаблон регулярных выражений. Это соответствует Passphrase= а затем отбрасывает сопоставленный текст с помощью оператора сброса соответствия \K и затем соответствует 1 или более символов, как можно меньше, до первого \ чар с последующим n письмо.

Вы можете использовать групповой подход захвата, который выглядит проще, хотя:

QRegularExpression rx(R"(Passphrase=(.+?)\\n)");
qDebug() << rx.match(str).captured(1);   // Here, grab Group 1 value!

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

Единственное, чего вам не хватало, так это ленивого квантификатора, говорящего вашему регулярному выражению совпадать только столько, сколько необходимо, и позитивного взгляда сзади. Первый из них представляет собой простой знак вопроса после плюса, а второй - просто добавление фразы, которую вы хотите сопоставить, но не добавляете путем ввода. ?<=, Проверьте пример кода, чтобы увидеть его в действии.

(?<=Passphrase=).+?(?=\\n)

const regex = /(?<=Passphrase=).+?(?=\\n)/gm;
const str = `[wifi_d0b5c2bc1d37_7078706c617967726f756e64_managed_psk]\\nPassphrase=testpasssword\\nName=pxplayground\\nSSID=9079706c697967726f759e69\\nFrequency=2462\\nFavorite=true\\nAutoConnect=true\\nModified=2018-06-18T09:06:26.425176Z\\nIPv4.method=dhcp\\nIPv4.DHCP.LastAddress=0.0.0.0\\nIPv6.method=auto\\nIPv6.privacy=disabled\\n
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Другие вопросы по тегам