【问题标题】:Regular expression for match string with new line char带有换行符的匹配字符串的正则表达式
【发布时间】:2018-06-19 00:01:22
【问题描述】:

如何使用正则表达式匹配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

【问题讨论】:

  • Passphrase=(.+)捕获它。
  • 你是字面意思还是LF?
  • 这是我的情况:regex101.com/r/AmT6PH/1。 @Wiktor Stribiżew 在我的情况下不起作用。
  • 您确定您正在测试正确的 literal 字符串吗?显示代码。您确定您在此处发布了 literal 字符串,而不是 string literal?请参阅Passphrase=(.+?)\\n,但在您说“它有效”或“它不起作用”之前,请检查代码中的两种解决方案,而不是在线正则表达式测试器。
  • 试试[^=]*(?=\\nName)。但我怀疑如果密码可以包含=,它就不会是防弹的。最好的办法是使用捕获组。

标签: regex qt qregularexpression


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2011-11-08
      • 2012-06-05
      相关资源
      最近更新 更多