代码之家  ›  专栏  ›  技术社区  ›  TheNovice

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

  •  2
  • TheNovice  · 技术社区  · 6 年前

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

    • “语言:(ruby和python)角色:(软件工程师或数据 科学家)
    • “角色:(软件工程师或数据科学家)语言:(ruby和python)”
    • “语言:'python'角色:'software engineer'”
    • “语言:(ruby和python)角色:(软件工程师或数据 科学家)
    • “语言:'python'角色:'software engineer'”
    • “语言:'python'

    我想解析这个字符串,确定 role: 存在于字符串中,然后捕获与“角色”相关的任何单词,排除不包含在紧邻的帕伦中的任何单词。 ) ' …在这个例子中, "languages:'python'role:'software engineer'" 会返回“软件工程师”和 "role:(software engineer or data scientist) languages:(ruby AND python)" 将返回“软件工程师或数据科学家”。

    有没有办法用类似于单词边界的东西来做这个?特别是比赛后的区域 角色: 用引号或 () ?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Wiktor Stribiżew Cristian Lupascu    6 年前

    您可以使用

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

    regex demo

    细节

    • role: -字串子串
    • (?: -交替非捕获组的开始:
      • \( -A ( 烧焦
      • \K - match reset operator 丢弃到目前为止匹配的文本
      • [^()]+ -1+字符 ( )
      • (?=\)) -A ) 应遵循当前位置
    • | -或
    • ' -A 烧焦
    • K -match reset运算符放弃到目前为止匹配的文本
    • [^']+ -1+字符
    • (?=') -一定有 立即向右移动
    • ) -候补组结束。

    注意:如果你不在乎是否有 ) 或尾随 ,删除lookaheads以简化regex。

    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