【问题标题】:why condition is always true in javascript?为什么条件在 javascript 中总是正确的?
【发布时间】:2018-11-09 20:40:52
【问题描述】:

你能告诉我为什么我的情况总是正确的?我正在尝试使用正则表达式验证我的价值。我的条件很少

  1. 名称不应包含测试“文本”
  2. 名称不应包含三个连续字符,例如“abc”、“pqr”、“xyz”
  3. 名称不应包含三个相同的字符,例如“aaa”、“ccc”、“zzz”

我喜欢这个

https://jsfiddle.net/aoerLqkz/2/

var val = 'ab dd'

if (/test|[^a-z]|(.)\1\1|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz/i.test(val)) {
                       alert( 'match')
                    } else {
   alert( 'false')
   }

我用以下字符串测试了我的代码并得到了意想不到的结果

  1. 输入字符串 "abc" : 输出良好 :: "match"
  2. 输入字符串 "aaa" : 输出正常 :: "match"
  3. 输入字符串 "aa a" : **output ** :: "match" 为什么匹配?它们之间有空格为什么它匹配????

    输入字符串 "sa c" : **output ** :: "match" 为什么是 match ??它们之间有不同的字符串和空格????

【问题讨论】:

  • @Martijn — 那是不是 a-z
  • “测试文本”还是“文本测试”?
  • 为什么不会 "aa a" 匹配?您的模式(第二个分支)说“任何非字母”,空格不是字母。如果你输入"aa1a" 也是一样的——第一个不是字母,因此是匹配的。
  • 没有法律规定你必须编写一个巨大的正则表达式。如果您使用三个较小的正则表达式,这将更容易编写和理解。

标签: javascript regex


【解决方案1】:

字符串sa c 包含一个空格,模式[^a-z](不是a 到z)匹配空格。

您可能想要使用^$,这样您的模式也会匹配字符串的开头和结尾,而不是在其中的任何位置寻找匹配项。

【讨论】:

  • 什么是正确的正则表达式..!!请改变我的小提琴以获得预期的结果
  • @joy 你自己修改正则表达式可能更有用......以加强你对这个答案的理解。
  • @Joy 对于所写的问题,只需删除正则表达式的 [^a-z] 分支;但是,大概你有一些理由添加这个,所以我们只能猜测你想要它做什么。
  • 我只有三个条件,请看上面三个条件
【解决方案2】:

它们之间有空格为什么它匹配????

因为您的正则表达式的[^a-z] 部分与空格匹配:

> /[^a-z]/i.test('aa a');
true

【讨论】:

  • 什么是正确的正则表达式..!!请改变我的小提琴以获得预期的结果
  • @Joy 无法判断,因为这部分正则表达式是您的问题中未列出的第四个条件。对于所写的条件,您根本不需要[^a-z] 部分。
【解决方案3】:

问题是[^a-z]。这意味着任何包含非字母字符的字符串都是匹配的。在您的示例中,它与空格字符匹配。

解决方案?只需删除|[^a-z]。没有它,您的正则表达式就满足所有三个条件。

  1. test 检查值是否包含单词“test”。
  2. abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz 检查值是否包含三个连续的字母。
  3. (.)\1\1 检查是否有任何字符重复了 3 次。

完整的正则表达式:

/test|(.)\1\1|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz/i`

我发现在编写正则表达式时使用正则表达式测试器(如 https://www.regexpal.com/)很有帮助。

注意:我假设第二个标准实际上是指“三个连续的字母”,而不是“三个连续的字符”。如果不是这样,那么您的正则表达式不符合第二个条件,因为它只检查三个连续的字母。

【讨论】:

    【解决方案4】:

    我不会用正则表达式来做这件事,这个表达式总是会变得更复杂,如果你编程的话,你就没有这样的可能性。

    你说的规则暗示了字符串导数的概念。字符串的导数是每个连续字符之间的距离。它在处理密码安全检查和一般字符串变化时特别有用。

    const derivative = (str) => {
      const result = [];
      for(let i=1; i<str.length; i++){
        result.push(str.charCodeAt(i) - str.charCodeAt(i-1));
      }
      return result;
      };
    
    //these strings have the same derivative: [0,0,0,0]
    console.log(derivative('aaaaa'));
    console.log(derivative('bbbbb'));
    
    //these strings also have the same derivative: [1,1,1,1]
    console.log(derivative('abcde'));
    console.log(derivative('mnopq'));
    
    //up and down: [1,-1, 1,-1, 1]
    console.log(derivative('ababa'));

    考虑到这一点,您可以将每个规则应用于每个字符串。

    //    Rules:
    // 1.   Name should not contain test "text"
    // 2.   Name should not contain three consecutive characters example "abc" , "pqr" ,"xyz"
    // 3.   Name should not contain the same character three times example "aaa", "ccc" ,"zzz"
    
    const derivative = (str) => {
      const result = [];
      for(let i=1; i<str.length; i++){
        result.push(str.charCodeAt(i) - str.charCodeAt(i-1));
      }
      return result;
      };
      
    const arrayContains = (master, sub) => 
        master.join(",").indexOf( sub.join( "," ) ) == -1;
    
    
    const rule1 = (text) => !text.includes('text');
    
    const rule2 = (text) => !arrayContains(derivative(text),[1,1]);
    
    const rule3 = (text) => !arrayContains(derivative(text),[0,0]);
    
    const testing = [
      "smthing textual",'abc','aaa','xyz','12345',
      '1111','12abb', 'goodbcd', 'weeell'
    ];
    
    const results = testing.map((input)=>
      [input, rule1(input), rule2(input), rule3(input)]);
    
    console.log(results);

    【讨论】:

      【解决方案5】:

      基于帖子中的 3 个条件,以下正则表达式应该可以工作。

      正则表达式:^(?:(?!test|([a-z])\1\1|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz).)*$

      Demo

      【讨论】:

      • 这并没有试图回答这个问题,“为什么我的条件总是正确的?”
      • @canon,我同意。这篇文章有超过 1 个答案正确地解决了该特定问题。但是,我觉得 OP 的正则表达式与列出的条件不匹配。
      猜你喜欢
      • 2021-11-09
      • 2013-02-22
      • 2014-01-21
      • 1970-01-01
      • 2016-08-04
      • 2020-10-16
      • 2021-12-23
      • 2014-12-02
      相关资源
      最近更新 更多