正则表达式匹配子字符串并返回特定分隔符之间的字符串
Regex matching on a substring and returning the string between specific delimiters
假设我有一个可以用几种不同方式格式化的字符串,例如:
- "语言:(ruby AND python) 角色:(软件工程师或数据
科学家)"
- "role:(software engineer or data scientist) languages:(ruby AND python)"
- "languages:'python' role:'software engineer'"
- "语言:(ruby AND python)角色:(软件工程师或数据
科学家)"
- "languages:'python'role:'software engineer'"
- "语言:'python'
我想解析这个字符串,确定字符串中是否存在 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[^']+(?='))/)
详情
role:
- 文字子串
(?:
- 交替非捕获组的开始:
\(
- 一个 (
字符
\K
- match reset operator 丢弃目前匹配的文本
[^()]+
- (
和 )
以外的 1+ 个字符
(?=\))
- )
应该跟在当前位置 之后
|
- 或
'
- 一个 '
字符
\K
- 匹配重置运算符丢弃目前匹配的文本
[^']+
- '
以外的 1+ 个字符
(?=')
- 右边必须有 '
个字符
)
- 交替组结束。
注意:如果您不关心是否有 )
或尾随 '
,请删除前瞻以简化正则表达式。
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
假设我有一个可以用几种不同方式格式化的字符串,例如:
- "语言:(ruby AND python) 角色:(软件工程师或数据 科学家)"
- "role:(software engineer or data scientist) languages:(ruby AND python)"
- "languages:'python' role:'software engineer'"
- "语言:(ruby AND python)角色:(软件工程师或数据 科学家)"
- "languages:'python'role:'software engineer'"
- "语言:'python'
我想解析这个字符串,确定字符串中是否存在 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[^']+(?='))/)
详情
role:
- 文字子串(?:
- 交替非捕获组的开始:\(
- 一个(
字符\K
- match reset operator 丢弃目前匹配的文本[^()]+
-(
和)
以外的 1+ 个字符
(?=\))
-)
应该跟在当前位置 之后
|
- 或'
- 一个'
字符\K
- 匹配重置运算符丢弃目前匹配的文本[^']+
-'
以外的 1+ 个字符
(?=')
- 右边必须有'
个字符)
- 交替组结束。
注意:如果您不关心是否有 )
或尾随 '
,请删除前瞻以简化正则表达式。
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