为什么条件在javascript中始终为真?

时间:2018-11-08 15:33:51

标签: javascript regex

您能否告诉我为什么我的情况总是正确的?我正在尝试使用regex验证我的价值。我没有多少条件

  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”:输出良好 ::“匹配”
  2. 输入字符串“ aaa”:输出良好 ::“匹配”
  3. 输入字符串“ aa a”:**输出** ::“ match”为什么匹配?他们之间有空间为什么匹配????

    输入字符串“ sa c”:**输出** ::“ match”为什么匹配?它们之间有不同的字符串和空格????

5 个答案:

答案 0 :(得分:9)

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

可能您想使用^$,因此您的模式也匹配字符串的开头和结尾,而不是在字符串中的任何地方查找匹配项。

答案 1 :(得分:5)

  

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

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

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

答案 2 :(得分:1)

问题是[^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检查是否有任何字符重复了三遍。

完整的正则表达式:

/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/)很有帮助。

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

答案 3 :(得分:0)

我不会使用常规表达式来执行此操作,这种表达式将总是变得更加复杂,并且如果您对此进行编程,则将没有任何可能性。

您说的规则建议使用字符串派生的概念。字符串的派生词是每个成功字符之间的距离。通常,它在处理密码安全性检查和字符串变化时特别有用。

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);

答案 4 :(得分:-1)

根据帖子中的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