Javascript RegEx partial match - javascript

I have a regular expression pattern, which validates for a three digit number
/^\d{3}$/.test("123") // true
/^\d{3}$/.test("123.") // false
I want to use this regex as an input restriction on a textbox.
Basically, if the new value matches, i allow the character to by typed, otherwise i prevent it.
The problem is that no value will ever match, becase "1" is not a full match, and will not allow me to type it.
Is it any way of testing a partial match for a regEx in javascript?
/^\d{3}$/.test("123") // true
/^\d{3}$/.test("12") // "partial match"
/^\d{3}$/.test("a12") // false
EDIT
\d{3} was just an example.
I need to use an email regex or a phone regex as input restriction.
"email" // true
"email#" // true
"email##" // false
"#yahoo.com" // false
EDIT 2
I have a textBox plugin with input restriction based on a regular expression.
The regular expression can be anything, a hex color Regex, for example: (#){1}([a-fA-F0-9]){6}
I need to prevent user to insert characters which doesn't match the regex.
For example, if the textbox is empty, the first allowed character would be "#".
But if i test "#" character against the regex, it will return "false", because "#" by itself is not valid.
/^(#){1}([a-fA-F0-9]){6}$/.test("#") // false
But at the same time, "#" is partial valid because it respects the regex format (and i should allow user to type it)
What i need to know is if i can verify if a string is a partial match of a regex, so i can allow the user to type the character.
/^(#){1}([a-fA-F0-9]){6}$/.test("#") // is a partial match, allow type
/^(#){1}([a-fA-F0-9]){6}$/.test("#0") // is a partial match, allow type
/^(#){1}([a-fA-F0-9]){6}$/.test("#00") // is a partial match, allow type
/^(#){1}([a-fA-F0-9]){6}$/.test("#000") // is a partial match, allow type
/^(#){1}([a-fA-F0-9]){6}$/.test("#0000") // is a partial match, allow type
/^(#){1}([a-fA-F0-9]){6}$/.test("#00000") // is a partial match, allow type
/^(#){1}([a-fA-F0-9]){6}$/.test("#000000") // is a partial match, allow type
/^(#){1}([a-fA-F0-9]){6}$/.test("#000000D") // is not a match, prevent typing

You could partially validate the email address by using ()? for more letters and/or characters. Every ()? going deeper in the validation tree.
The following regular expression pattern validates email address letter by letter.
^[a-zA-Z]+(#{1}[a-zA-Z]*(\.{1}[a-zA-Z]*)?)?$
It does not take into account every possibility out there, but for basic ones like aa#bb.dd it works just fine and there's room to improve it further.

You would be better off by using a library like maskedinput.js.
You can then setup your text input like follows:
jQuery(function($){
$("#your_input").mask("999");
});
UPDATE
you can use a validator for forms and preset specific types of fields to validate

You can specify a range in the expression so that it matches anything between one and three digits like so:
/^\d{1,3}$/.test("1") // true
/^\d{1,3}$/.test("12") // true
/^\d{1,3}$/.test("123a") // false

Just provide a regex that allows for partial matches. e.g. /^\d{1,3}$/

According to your last edit, this should work:
/^#[a-fA-F0-9]{0,6}$/

You'll want to use explicit "|" partial matches. For your color matching example it's pretty simple, you just need to explicitly match an empty string partial
/^(|#[a-f0-9]{0,6})$/i.test(inputStr)
For an email it's more complicated since there are more partial match combinations
/^(|\w+|\w+#|\w+#\w+|\w+#\w+\.|\w+#\w+\.\w+)$/.test(inputStr)
Note that you can't get away with something like /^(|\w*#|...)$/ since that matches #blah.com which isn't a valid partial input.

Related

What is the right regex to allow blank or numeric values

I want to validate one variable named "Port" in my JavaScript to accept only either numerical digits or a blank value. I am not sure exactly what regex I can use to satisfy both conditions. Can anyone suggest me logic to use under my if loop to validate this?
If you want to achieve your goal with regexes, you are looking for:
const regex = /^\d*$/;
console.log(regex.test("")); // true
console.log(regex.test("8080")); // true
console.log(regex.test("4d54")); // false

How to find working regex pattern multiple times in single line in javascript?

I want to validate an text input field with javascript regex validation.
Validation that is needed is: Input field should have one or multiple email ids, all ending with semicolon(;).
Thus, correct input would be :
→ user1#xxx.com;
→ user1#xxx.com;user2#xxx.com;
→ user1#xxx.com;user2#xxx.com;user3#xxx.com;
Incorrect input would be
→ user1#xxx.com -------- Semicolon is missing
→ user1#xxx -------- Email Id is invalid
→ user1#xxx.com;user2#xxx.com -------- Semicolon(;) is missing after second email id
This is what I have tried so far which validates only one occurence of regex pattern, but not all occurences in single line.
(^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+#[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(;)+$)
Regex URL: https://regex101.com/r/4svUQz/2/ [All 4 values in TEST STRING should match, but it is matching only first 2]Also, I have checked below articles, but could not find answer.Regex single-line multiple matchRegex for The Same Pattern Multiple Times in One LineHow to validate an email address in JavaScript
First, for a simpler email regex to understand the principles involved, see How to check for a valid email address?. I will use: [^#]+#[^#]+\.[^#]+ with the recommendation that we also exclude space characters and so, in your particular case requiring a semicolon at the end and allowing multiple email addresses on the line:
^([^#\s]+#[^#\s]+\.[^#\s.]+;)+$
Note that I took the basic regex for an email address and appended ; and then put parentheses () around the entire expression and appended + signifying one or more times.
See Regex Demo
Using your regex, with a slight simplification involving the ; (i.e. removing unnecessary parentheses surrounding it):
^([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+#[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+;)+$
See Regex Demo

Finding difficulty in correct regex for URL validation

I have to set some rules on not accepting wrong url for my project. I am using regex for this.
My Url is "http ://some/resource/location".
This url should not allow space in beginning or middle or in end.
For example these spaces are invalid:
"https ://some/(space here in middle) resource/location"
"https ://some/resource/location (space in end)"
"(space in starting) https ://some/resource/location"
"https ://(space here) some/resource/location"
Also these scenario's are invalid.
"httpshttp ://some/resource/location"
"https ://some/resource/location,https ://some/resource/location"
Currently I am using a regex
var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*#)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%#!\-\/]))?/;
This regex accepts all those invalid scenarios. I am unable to find the correct matching regex which will accept only if the url is valid. Can anyone help me out on this?
We need to validate n number of scenarios for URL validation. If your particular about your given pattern then above regex expression from other answer looks good.
Or
If you want to take care of all the URL validation scenarios please refer In search of the perfect URL validation regex
/(ftp|http|https){1}:\/\/(?:.(?! ))+$/
is this regex OK ?
use this
^\?([\w-]+(=[\w-]*)?(&[\w-]+(=[\w-]*)?)*)?$
See live demo
This considers each "pair" as a key followed by an optional value (which maybe blank), and has a first pair, followed by an optional & then another pair,and the whole expression (except for the leading?) is optional. Doing it this way prevents matching ?&abc=def
Also note that hyphen doesn't need escaping when last in the character class, allowing a slight simplification.
You seem to want to allow hyphens anywhere in keys or values. If keys need to be hyphen free:
^\?(\w+(=[\w-]*)?(&\w+(=[\w-]*)?)*)?$

restrict characters in form field

I've an HTML field in a form and, using JS and Regex, I must restrict the characters the user can insert in the field. The user of the form can only insert the following characters ( ) * + ^ / X x, and numbers and spaces (when he digits or pastes a different character nothing is written). Is this possible? I need the Regex, I eventually know how to do with JS.
Try this regex
[^\(\)\*+\^/Xx0-9 ]
Here we are trying to find a pattern which contains none of the allowed characters. If you find it this means that the character entered was wrong.
There is no right or wrong answer to this.
Usually it is less expensive to check using the bias of the logic for the particular condition.
If it sounds better saying whats allowed, then use the allowed (positive) character class.
Allowed class: [()*+^/Xx0-9 ], Checks: <space> (-+ /-9 X \^ x
Not allowed class: [^()*+^/Xx0-9 ], Checks: \0-\37 !-' , \- . :-W Y-\] _-w y-\377
Statistically, if %99 of the data enterred were valid, the 'Allowed' class would do less work in that
not every character or range has to be checked.
Where the 'Not-Allowed' class will have to check every range.
In this particular case, the negative class has many more ranges and characters to check, its borderline
more efficient if most of the data were invalid,
With regard to:
[^\(\)\*+\^/Xx0-9 ]
None of those characters need to be escaped inside a set (but it is okay to do so).
If you want to restrict as the user types (this uses jquery methods):
$('#in1').keyup(function (evt) {
var content = $('#in1').val();
$('#in1').val(content.replace(/[^()*+^/Xx0-9]/g, ""));
return true;
});
Where 'in1' is the id of the input.

Negating in /,?(([1-9]-[1-9])|([1-9]))/g

I am trying to match a string containing a mix of digits and hyphenated digits, like a crossword answer specification, for example 1,2-2 or 1-1,3,4,2-2
/,?(([1-9]-[1-9])|([1-9]))/g is what I've come up to match the string
value = value.replace(/,?(([1-9]-[1-9])|([1-9]))/g, '');
replaces ok, and I've checked it out in an online tester.
What I really need is to negate this, so I can use it on a keyup event, examine the contents of a textarea and remove characters that don't fit, so it only allows through characters as in the example.
I've tried ^ where expected, but this it's not doing what I expect, how should I negate the regex so I remove everything that doesn't match?
If there is a better way of doing this I'm open to suggestions too.
var value = 'hello,1,2,3,4-6,1-1,3,test,4,2-2';
var pattern = /,?(([1-9]-[1-9])|([1-9]))/g;
value.replace(pattern, ''); // "hello,test"
You can use String#match. With /g flag, it returns an array of all the matches, then you can use Array#join to join them.
The problem is that String#match returns null when there is no match, so you have to handle that case and use an empty array so that it can join:
(value.match(pattern) || []).join(''); // ",1,2,3,4-6,1-1,3,4,2-2"
Note: It may better to check them on onblur rather than onkeyup. Messing with the text that the user is currently typing will make it annoying. Better to wait for the user to finish typing.
Didn't test it in JS, but this should return the valid string beginning from the left and as long as valid values are encountered (note that I used \d - if you'd like 1-9 only, then use your brackets).
(?:\d(?:-\d)?,)*\d(?:-\d)?
E.g. matching this regular expression with the string "0-1,1,2,3,4-4,2,,1,3--4" will return "0-1,1,2,3,4-4,2" as the first match.

Categories