当前瞻数据不存在时,正则表达式正向前瞻(PCRE)

当前瞻数据不存在时,正则表达式正向前瞻(PCRE)

我正在尝试匹配具有类似以下格式的字符串:

username=joe password='this! is a password with "quotes" and spaces#913 custom1 customd afd weirdhuh? custom1=myvalue

更详细地解释一下,这是一个用等号分隔的变量列表。可以传递的有效变量是:用户名、密码和 customX(其中 X 是任意数量的数字)。

我特别想匹配密码字段,因为传递的变量在技术上可以包含任意数量的引号、空格等有效字符。我决定,用于确定密码字符串何时终止的最佳“断点”是存在“customX=”字符串,这可以推断下一个变量正在开始。

因此,在上面的例子中,实际密码将是:

'this! is a password with "quotes" and spaces#913 custom1 customd afd weird huh?

我得到了以下正则表达式:

(?i)password(?-i)=.+?(?= (?i)custom(?-i)\d+=)

这似乎与以下内容相符:

password='this! is a password with "quotes" and spaces#913 custom1 customd afd weird huh?

这实际上是我想要的(我可以轻松解析出“password=”),但问题是这个正则表达式似乎只有在字符串末尾有最后的“custom1=myvalue”时才有效。如果删除它,那么就根本不匹配了。

无论最终值是否存在,我都需要能够匹配密码字符串。

如果您可以删除“密码=”而只留下实际密码,则可以获得加分。

答案1

但问题是这个正则表达式似乎只有在存在最后的“custom1 = myvalue”时才有效

您可以添加可选的字符串结尾来匹配,而不是custom1=myvalue
(?i)password(?-i)=.+?((?= (?i)custom(?-i)\d+=)|$)

如果您可以删除“密码=”而只留下实际密码,则可以获得加分。

匹配时使用后视password=
(?<=(?i)password(?-i)=).+?((?= (?i)custom(?-i)\d+=)|$)

相关内容