如何匹配相同格式但在字符集方面不同的正则表达式?

时间:2013-07-15 13:56:17

标签: regex regex-negation

假设我有一个字符串,我想只匹配值为空的部分而不是值存在的部分? 例如:& lang =& val = 1233 我只需要& lang而不是& val,因为它有实际价值? 我有这个

&(.+)=(?!\s\S)  在字符串中匹配& lang =& val =的正则表达式。 任何人都可以帮助我

4 个答案:

答案 0 :(得分:1)

使用以下正则表达式:

(?:(?<=\?)|&)[^=]+=(?=&|$)

可以解释为:

  • (?: ....):不捕获(不组成团体),根据您的目的可能不需要这样做。
  • \?:转义?以确切匹配?
  • (?<=\?):意为“以?开头”:?未包含在结果中。
  • (?=&|$):意思是“后跟&”或“输入结束时”〜。

以下是Python交互式shell中的示例测试:

>>> pattern = r'(?:(?<=\?)|&)[^=]+=(?=&|$)'
>>> re.findall(pattern, '&lang=&val=')
['&lang=', '&val=']
>>> re.findall(pattern, '&lang=&val=1233')
['&lang=']
>>> re.findall(pattern, '&lang=&val=&val2=123&val3=')
['&lang=', '&val=', '&val3=']
>>> re.findall(pattern, '?lang=&val=&val2=123&val3=')
['lang=', '&val=', '&val3=']
>>> re.findall(pattern, '?lang=blah&val=&val2=123&val3=')
['&val=', '&val3=']
>>> re.findall(pattern, 'www.html.com?user=&lang=eng&code=.in')

答案 1 :(得分:0)

你是说

吗?
(&|?)([^&=]+)=(&|$)

(如果需要,可以使用非捕获组)

但我只是构建所有查询字符串参数的哈希值并选择没有值的键。它更便宜。

答案 2 :(得分:0)

试试这个:

[?&]([^&]+)=(&|$)

第一组将具有参数的名称。

请注意,此正则表达式还会捕获空的第一个参数(val1中的foo.php?val1=&val2=ok

答案 3 :(得分:0)

试试这个:

(&([^=]+))=(?=&)