【问题标题】:Regex matching on a substring and returning the string between specific delimiters正则表达式匹配子字符串并返回特定分隔符之间的字符串
【发布时间】:2018-06-20 21:10:35
【问题描述】:

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

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

我想解析这个字符串,确定字符串中是否存在role:,然后捕获与“角色”相关的任何单词,不包括未包含在关闭参数)中的任何单词或'... 所以在本例中,"languages:'python'role:'software engineer'" 将返回“软件工程师”,"role:(software engineer or data scientist) languages:(ruby AND python)" 将返回“软件工程师或数据科学家”。

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

【问题讨论】:

  • 试试s.scan(/role:\(([^()]+)\)/),或者如果你只希望每个字符串匹配1个,s[/role:\(([^()]+)\)/, 1]
  • @WiktorStribiżew - 这适用于 parens 案例,我正在尝试稍微调整您的正则表达式以涵盖 "languages:'python' role:'software engineer'""languages:'python'role:'software engineer'" 案例!
  • 做到了。谢谢@WiktorStribiżew。想要将其添加为答案,以便我将您的答案归功于您?

标签: ruby regex delimiter


【解决方案1】:

你可以使用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多