简体   繁体   中英

Validate text with javascript RegEX

I'm trying to validate text with javascript but can find out why it's not working.

I have been using : https://regex101.com/ for testing where it works but in my script it fails

    var check = "test"
    var pattern = new RegExp('^(?!\.)[a-zA-Z0-9._-]+$(?<!\.)','gmi');
    if (!pattern.test(check)) validate_check = false;else validate_check = true;

What i'm looking for is first and last char not a dot, and string may contain [a-zA-Z0-9._-]

But the above check always fails even on the word : test

+$(?<!\\.) is invalid in your RegEx

  1. $ will match the end of the text or line (with the m flag )
  2. Negative lookbehind(?<!Y)X will match X , but only if Y is not before it

What about more simpler RegEx?

 var checks = ["test", "1-t.e_s.t0", ".test", "test.", ".test."]; checks.forEach(check => { var pattern = new RegExp('^[^.][a-zA-Z0-9\\._-]+[^.]$','gmi'); console.log(check, pattern.test(check)) });

Your code should look like this:

 var check = "test"; var pattern = new RegExp('^[^.][a-zA-Z0-9\\._-]+[^.]$','gmi'); var validate_check = pattern.test(check); console.log(validate_check);

A few notes about the pattern:

  • You are using the RegExp constructor, where you have to double escape the backslash. In this case with a single backslash, the pattern is ^(?!.)[a-zA-Z0-9._-]+$(?<!.) and the first negative lookahead will make the pattern fail if there is a character other than a newline to the right, that is why it does not match test
  • If you use the /i flag for a case insensitive match, you can shorten [A-Za-z] to just one of the ranges like [az] or use \\w to match a word character like in your character class
  • This part (?<!\\.) using a negative lookbehind is not invalid in your pattern, but is is not always supported

For your requirements, you don't have to use lookarounds. If you also want to allow a single char, you can use:

^[\w-]+(?:[\w.-]*[\w-])?$
  • ^ Start of string
  • [\\w-]+ Match 1+ occurrences of a word character or -
  • (?: Non capture group
    • [\\w.-]*[\\w-] Match optional word chars, a dot or hyphen
  • )? Close non capture group and make it optional
  • $ End of string

Regex demo

 const regex = /^[\\w-]+(?:[\\w.-]*[\\w-])?$/; ["test", "abc....abc", "a", ".test", "test."] .forEach((s) => console.log(`${s} --> ${regex.test(s)}`) );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM