首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx与其中的异常匹配

RegEx与其中的异常匹配
EN

Stack Overflow用户
提问于 2020-05-03 14:16:00
回答 3查看 514关注 0票数 1

我寻找一种方法来匹配其中的例外。例如,我想要匹配ab-3/3/6,但我不想匹配ab-4/2/5:34。而且如果ab-4/2/5:34存在..。我根本不想和它相匹配。

对于这个解决方案,我构建了以下正则表达式:ab-\d{1,2}\/\d{1,2}\/\d{1,2}[^:]

我在这里的问题是,我想要的匹配只有在它们后面仍然有字符(比如空格或新行)时才能工作。因此,例如,我有以下案文:

代码语言:javascript
复制
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缺失了,因为这里没有它背后的角色。

有人能帮我找到解决这个问题的办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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]) (然后,您将在字母或_之前得到匹配)。

所以,使用任何一种

代码语言:javascript
复制
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?![:\d])
//                            ^^^^^^^^^   
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}\b(?!:)
//                            ^^^^^^^

regex演示#1regex演示2。看看它们在附加输入时的行为有多不同。

票数 2
EN

Stack Overflow用户

发布于 2020-05-03 14:29:44

一个否定式字符类匹配除列出的字符( : )以外的任何字符,但它确实期望有一个字符存在(例如,空格、换行符或另一个数字)。

您可以使用一个单词边界\b开始匹配,以防止ab成为一个较长的单词的一部分,并以负查找前面的(?!:)结束该模式,而不是在1或2个数字之后断言一个:

代码语言:javascript
复制
\bab-\d{1,2}\/\d{1,2}\/\d{1,2}(?!:)

regex演示

票数 1
EN

Stack Overflow用户

发布于 2020-05-03 14:45:16

您的regex可以是:/ab-\d{1,2}\/\d{1,2}\/\d{1,2}(?<!:)$/

样本:

代码语言:javascript
复制
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));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61575931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档