比方说,我有一个可以用几种不同方式格式化的字符串,例如:
我想解析该字符串,确定字符串中是否存在 <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)"
分隔吗?
答案 0 :(得分:3)
您可以使用
s.scan(/role:(?:\(\K[^()]+(?=\))|'\K[^']+(?='))/)
请参见regex demo
详细信息
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