【问题标题】:How to check regex true on no repeating letters? [duplicate]如何在没有重复字母的情况下检查正则表达式是否正确? [复制]
【发布时间】:2016-02-18 06:46:05
【问题描述】:

我需要检查一个单词是否是Isogram,Isogram的意思是一个单词没有重复的字母。

我需要实现一个函数来确定仅包含字母的字符串是否为等值线。假设空字符串是等值线。忽略字母大小写。

这是一个测试用例

isIsogram( "Dermatoglyphics" ) == true
isIsogram( "aba" ) == false
isIsogram( "moOse" ) == false // -- ignore letter case

我正在考虑使用正则表达式。

function isIsogram(str){
  //...
}

你能帮忙吗?

【问题讨论】:

  • 为什么要使用正则表达式?只需使用一组字符。
  • @Oriol 我认为这是正确的方法。有没有更好的方法?
  • @NietzscheProgrammer 你不能把字符串的字符放在一个数组中然后调用 distinct 吗?如果原始数组的长度与不同的数组不同,则它是一个等值线。
  • 呸跛脚关闭...这个被标记为重复的问题有糟糕的答案...
  • 我在这里重新发布了我对链接问题的回答:stackoverflow.com/a/35469422/1800023

标签: javascript regex


【解决方案1】:

就这么简单

function isIsogram (str) {

    return !/(\w).*\1/i.test(str);
}

【讨论】:

  • 为了简单和最小的代码+1
  • 这是不正确的,因为它不忽略大小写。删除/i
  • 加上@Err 我的代码小了一个字符,所以:p
【解决方案2】:

这样就可以了:

function isIsogram (str) {
    return !/(.).*\1/.test(str);
}

【讨论】:

  • 抱歉复活和旧的提交,你能介绍一下语法是如何匹配字符串的吗?可读性有点混乱
  • (.) 捕获任何字母。 .* 后跟任何字母序列,包括任何内容。 \1 后面是我们捕获的第一个字母。换句话说,这将匹配任何至少有两个相同字母的字符串。取与该布尔值相反的值。
【解决方案3】:

您可以通过将输入转换为小写来使用它:

var re = /^(?:([a-z])(?!.*\1))*$/;

function isIsogram(str) {
   return re.test( str.toLowerCase() );
}

测试:

isIsogram("Dermatoglyphics")
true
re.test("aba")
false
isIsogram("moOse")
false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2016-07-13
    • 2020-08-29
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多