我寻找一种方法来匹配其中的例外。例如,我想要匹配ab-3/3/6,但我不想匹配ab-4/2/5:34。而且如果ab-4/2/5:34存在..。我根本不想和它相匹配。
对于这个解决方案,我构建了以下正则表达式:ab-\d{1,2}\/\d{1,2}\/\d{1,2}[^:]
我在这里的问题是,我想要的匹配只有在它们后面仍然有字符(比如空格或新行)时才能工作。因此,例如,我有以下案文:
ab-3/3/6
ab-4/2/5:34
ab-6/1/4我的匹配只包含ab-3/3/6。
我想存档的是它找不到ab-4/2/5。
但是ab-6/1/4缺失了,因为这里没有它背后的角色。
有人能帮我找到解决这个问题的办法吗?
发布于 2020-05-06 09:16:30
您需要使用的不是否定字符类,而是负后视。但是,由于在查找之前的最后一个模式是量化的,并且模式匹配长度是未知的,所以regex引擎可能会回溯并匹配您希望失败的字符串。这意味着您不能仅仅用[^:]替换(?!:)。
不应该匹配的示例字符串可以是ab-3/3/6987:/\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?!:)/将获取带有最后一个\d{1,2}的69,然后(?!:)查找将检查8是否为:,并返回"OK“。您将得到一个ab-3/3/69匹配。
您需要在查找之前使用单词边界(如果下一个字符不能是字母、数字或_),或者只需将\d添加到:,即使用(?![:\d]) (然后,您将在字母或_之前得到匹配)。
所以,使用任何一种
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?![:\d])
// ^^^^^^^^^
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}\b(?!:)
// ^^^^^^^发布于 2020-05-03 14:29:44
一个否定式字符类匹配除列出的字符( : )以外的任何字符,但它确实期望有一个字符存在(例如,空格、换行符或另一个数字)。
您可以使用一个单词边界\b开始匹配,以防止ab成为一个较长的单词的一部分,并以负查找前面的(?!:)结束该模式,而不是在1或2个数字之后断言一个:。
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?!:)发布于 2020-05-03 14:45:16
您的regex可以是:/ab-\d{1,2}\/\d{1,2}\/\d{1,2}(?<!:)$/
样本:
const dateStr = `ab-3/3/6
ab-4/2/5:34
ab-6/1/4`;
const matchAll = (str) => {
let m;
const reg = /ab-\d{1,2}\/\d{1,2}\/\d{1,2}(?<!:)$/gm;
let result = [];
do {
m = reg.exec(str);
if (m) {
result.push(m[0]);
}
} while (m);
return result;
};
console.log(matchAll(dateStr));
https://stackoverflow.com/questions/61575931
复制相似问题