正则表达式匹配子字符串并返回特定分隔符之间的字符串

Regex matching on a substring and returning the string between specific delimiters

假设我有一个可以用几种不同方式格式化的字符串,例如:

我想解析这个字符串,确定字符串中是否存在 role:,然后捕获与 "role" 相关的所有单词,排除未包含在字符串中的任何单词关闭 parans )'... 所以在这个例子中,"languages:'python'role:'software engineer'" 会 return "software engineer" 和 "role:(software engineer or data scientist) languages:(ruby AND python)" 会 return "software engineer or data scientist".

有没有办法用像单词边界这样的东西来做到这一点?具体来说,role: 匹配后的区域将由引号或 ()?

分隔

您可以使用

s.scan(/role:(?:\(\K[^()]+(?=\))|'\K[^']+(?='))/)

regex demo

详情

  • role: - 文字子串
  • (?: - 交替非捕获组的开始:
    • \( - 一个 ( 字符
    • \K - match reset operator 丢弃目前匹配的文本
    • [^()]+ - ()
    • 以外的 1+ 个字符
    • (?=\)) - ) 应该跟在当前位置
    • 之后
  • | - 或
  • ' - 一个 ' 字符
  • \K - 匹配重置运算符丢弃目前匹配的文本
  • [^']+ - '
  • 以外的 1+ 个字符
  • (?=') - 右边必须有 ' 个字符
  • ) - 交替组结束。

注意:如果您不关心是否有 ) 或尾随 ',请删除前瞻以简化正则表达式。

Ruby demo:

s  = "languages:(ruby AND python) role:(software engineer or data scientist) role:(software engineer or data scientist) languages:(ruby AND python) languages:'python' role:'software engineer'  languages:(ruby AND python)role:(software engineer or data scientist) languages:'python'role:'software engineer' languages:'python'"
puts s.scan(/role:(?:\(\K[^()]+(?=\))|'\K[^']+(?='))/)

输出:

software engineer or data scientist
software engineer or data scientist
software engineer
software engineer or data scientist
software engineer