Reputation: 23
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
Upvotes: 2
Views: 1806
Reputation: 163217
A few notes about the pattern:
^(?!.)[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
/i
flag for a case insensitive match, you can shorten [A-Za-z]
to just one of the ranges like [a-z]
or use \w
to match a word character like in your character class(?<!\.)
using a negative lookbehind is not invalid in your pattern, but is is not always supportedFor 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 stringconst regex = /^[\w-]+(?:[\w.-]*[\w-])?$/;
["test", "abc....abc", "a", ".test", "test."]
.forEach((s) =>
console.log(`${s} --> ${regex.test(s)}`)
);
Upvotes: 0
Reputation: 3917
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);
Upvotes: 0
Reputation: 420
+$(?<!\.)
is invalid in your RegEx
$
will match the end of the text or line (with the m
flag)(?<!Y)X
will match X
, but only if Y
is not before itUpvotes: 1