1

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

2 回答 2

1

有了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!

请参阅此正则表达式演示

于 2018-06-18T14:07:32.213 回答
1

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

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

于 2018-06-18T13:37:39.650 回答