除一个版本外,如何匹配字符串模式

时间:2017-09-19 03:51:10

标签: regex

我有一组我们希望向用户展示的字符串。

我们希望匹配所有采用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”版本。如何更改我的正则表达式以使其不匹配?

3 个答案:

答案 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)

  • 断言下面的正则表达式与api不匹配 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}`);
    });
}