我正在尝试匹配具有类似以下格式的字符串:
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+=)|$)