带有新行字符的匹配字符串的正则表达式

Regular expression for match string with new line char

如何使用正则表达式匹配 Passphrase= 字符串和 \n 字符之间的文本密码 (Select: 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

您唯一缺少的是惰性量词告诉您的正则表达式只匹配必要的数量和积极的回顾。第一个是加号后面的一个简单的问号,第二个只是在你想匹配但不包含的短语前面输入 ?<=。查看代码示例以查看实际效果。

(?<=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}`);
    });
}

使用支持 PCRE 正则表达式语法的 QRegularExpression,您可以使用

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

regex demo

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!

this regex demo