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

时间:2018-06-20 21:10:35

标签: ruby regex delimiter

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

  • “语言:(红宝石和python)作用:(软件工程师或数据 科学家)”
  • “角色:(软件工程师或数据科学家)语言:(红宝石和python)”
  • “语言:'python'角色:'软件工程师'”
  • “语言:(红宝石和python)角色:(软件工程师或数据 科学家)”
  • “语言:'python'角色:'软件工程师'”
  • “语言:'python'

我想解析该字符串,确定字符串中是否存在 <md-input v-model="initial" type="text" v-validate="'required|email'" data-vv-name="email1"></md-input> ,然后捕获与“角色”相关的任何单词,排除不包含在封闭的括号中的任何单词{{ 1}}或role: ...,因此在此示例中,)将返回“软件工程师”,而'将返回“软件工程师或数据科学家”。

有没有办法像单词边界一样做到这一点?具体来说,"languages:'python'role:'software engineer'"上比赛之后的区域将用引号或"role:(software engineer or data scientist) languages:(ruby AND python)"分隔吗?

1 个答案:

答案 0 :(得分:3)

您可以使用

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