匹配直到第一次出现一个术语后跟一个角色

时间:2017-05-09 12:54:21

标签: regex

我想匹配只有一个搜索词的字符串(这只是我示例中的第一个字符串)。包含多个搜索字词的字符串以+符号分隔:

  • jobs?search=term1&location=&distance=10+page=2

  • jobs?search=term1+term2&location=ca&distance=30

  • jobs?search=term1+term2+term3&location=nyc&distance=25

我的想法是匹配任何单词(前面有search=不是后跟+,但后跟&

search=.*?[^+]&

但它不太有效并且用多个术语捕获字符串。

2 个答案:

答案 0 :(得分:1)

您需要使用

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

请参阅regex demo

它将匹配:

  • [&?] - ?&(以确保search是整个密钥名称)
  • search= - 文字子字符串
  • ([^&+]+) - 第1组捕获+&以外的1 +个符号
  • (?=&|$) - 需要&或字符串结尾的前瞻,在前一个子模式捕获的最后一个符号后立即显示(注意它可以替换为非捕获组,{{1 },该值仍将在Group 1中。

Python demo

(?:&|$)

Base R

import re
ss = ['jobs?search=term1&location=&distance=10+page=2','jobs?search=term1+term2&location=ca&distance=30','jobs?search=term1+term2+term3&location=nyc&distance=25']
rx = re.compile(r'[&?]search=([^&+]+)(?=&|$)')
for s in ss:
    m = rx.search(s)
    if m:
        print("{}: {}".format(s, m.group(1)))

...或使用R stringr

ss <- c('jobs?search=term1&location=&distance=10+page=2','jobs?search=term1+term2&location=ca&distance=30','jobs?search=term1+term2+term3&location=nyc&distance=25')
results <- regmatches(ss, regexec("[&?]search=([^&+]+)(?:&|$)",ss))
unlist(results)[2]

答案 1 :(得分:1)

如果您只想捕获术语而不是前面的search=

(?<=search=)[^+]*?(?=&|$)
  • (?<=search=) - 确保搜索=在术语
  • 之前的正向Lookbehind
  • [^+]*? - 匹配该字词(确保它不包含任何+)。这是一个非贪婪的匹配(使用*?),以便第一次出现&amp;原理
  • (?=&|$) - 确保术语后跟&或字符串结尾($
  • 的肯定前瞻

Regex101 Demo