我有一组我们希望向用户展示的字符串。
我们希望匹配所有采用XYZ -____- xxx-tests形式的字符串,除非____是API。
ABCDEFGH - don't match
XYZ-api-xxx-tests - don't match
XYZ-google-xxx-tests - match
XYZ-bing-xxx-tests - match
我们现在正在使用正则表达式,但它甚至匹配字符串模式的“API”版本。如何更改我的正则表达式以使其不匹配?
答案 0 :(得分:1)
尝试:XYZ-(?!api)\w+-xxx-tests
(?!api)
是api这个词的负面预测。所以在XYZ-
之后,如果找到api,它将停止匹配。 \w+
代表相同位置的任何字母数字字符。字符串的其余部分只是实际的字符匹配。
请参阅正则表达式演示和说明: https://regex101.com/r/Pc7lBP/1
答案 1 :(得分:1)
根据您使用结果的方式,另一个常用的习惯用法是将列入黑名单的"匹配"在第一次交替中,然后捕获第二次交替。
XYZ-api-xxx-tests|(XYZ-\w+-xxx-tests)
这应该匹配,但如果比较的字符串是列入黑名单的匹配,则它在获取的组中不会有任何内容。你最终得到一堆字符串或什么都没有的结果,并且可以从那里过滤。
答案 2 :(得分:0)
这是有效的:
XYZ-(?!api).*-xxx-tests
https://regex101.com/r/wWLbv4/1
否定前瞻(?!api)
const regex = /XYZ-(?!api).*-xxx-tests/g;
const str = `ABCDEFGH - don't match
XYZ-api-xxx-tests - don't match
XYZ-google-xxx-tests - match
XYZ-bing-xxx-tests - match
`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}