【问题标题】:regex character appearing exactly two times正则表达式字符恰好出现两次
【发布时间】:2021-12-12 09:34:33
【问题描述】:

给定一个字符串数组,测试是否有字符恰好出现了两次。

示例:

const input = ['asdf', 'fdas', 'asds', 'd fm', 'dfaa', 'aaaa', 'aabb', 'aaabb'];
const output = ['asds', 'dfaa', 'aabb', 'aaabb'];

我试过这样

/(?:^|(.)(?!\1))([A-Za-z0-9])\2(?!\2)/

但我只有这些字符串:['dfaa', 'aabb', 'aaabb']

有什么建议吗?

【问题讨论】:

  • 这能回答你的问题吗? Regex to match when a string is present twice
  • 我已经看到了这个答案。映射到某个表达式。就我而言,我需要检查字符。
  • @Fish,另外,您引用的问题是搜索给定单词的实例。在这里,我们正在寻找恰好出现两次的任何字符。
  • 啊,好点子,any 字符是这里的关键
  • @Fish,我删除了我的答案,直到我可以修复它以解决您的问题。似乎正则表达式引擎独立地满足了这两个前瞻,而不是试图找到一个同时满足两者的解决方案。

标签: javascript regex string


【解决方案1】:

你可以使用

/(.)(?<=^(?:(?!\1).)*\1(?=(?:(?!\1).)*\1(?:(?!\1).)*$))/s

请参阅regex demo注意,由于我们只寻找第一个匹配项,因此没有 g 标志。 详情

  • (.) - 捕获到第 1 组的任何一个字符:
  • (?&lt;= - 正面向后看的开始,紧靠左边,应该有
    • ^ - 字符串开头
    • (?:(?!\1).)* - 任何字符,尽可能多,但捕获到第 1 组的字符除外
    • \1 - 第 1 组捕获的相同字符
    • (?=(?:(?!\1).)*\1(?:(?!\1).)*$) - 正向前瞻,需要除第 1 组中的字符之外的任何零个或多个字符,然后是第 1 组中捕获的相同字符,以及除第 1 组中的字符之外的任何零个或多个字符,直到字符串结束
  • ) - 回顾结束。

内部带有tempered greedy tokens 的环视方法确保捕获的字符在字符串中仅出现两次。

查看 JavaScript 演示:

const input = ['asdf', 'fdas', 'asds', 'd fm', 'dfaa', 'aaaa', 'aabb', 'aaabb'];
const re = /(.)(?<=^(?:(?!\1).)*\1(?=(?:(?!\1).)*\1(?:(?!\1).)*$))/s;
for (const s of input) {
   console.log(s, '=>', re.test(s))
}

【讨论】:

    【解决方案2】:

    例如, /[^a]/gm:匹配下面列表中不存在的单个字符。

    const sampleArray = [ 'asdf', 'fdas', 'asds', 'd fm', 'dfaa', 'aaaa', 'aabb', 'aaabb'];
    
    var sampleOutput = [];
    
    sampleArray.forEach(function (item, index) {
      var dupResult = checkDuplicate(item);
      if(dupResult){
        sampleOutput.push(item);
      }
    });
    
    console.log(sampleOutput);
    
    function checkDuplicate(item){
        var isCountTwice = false;
        for(var i = 0; i < item.length; i++){
            if(item.replace(new RegExp("[^"+ item[i] +"]","gm"), "").length == 2){
                isCountTwice = true;
            }
        } 
        return isCountTwice;
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多