How to allow only WhatsApp format numbers in a regex? - regex

so I'm trying to make this Regex allow this the Dash symbol - For Example this Phone Number is not matching right now
+212 659-123456
So I need someone to help me change the Regex to allow it
please Here is the Regex:
^\+(?:[0-9]\x20?){6,14}[0-9]$
Because I am trying to only accept the format that is used by WhatsApp and some numbers might have multiple spaces or multiple Dashes. Also the Plus sign has to be mandatory Here some more examples of the format on WA.
+96274567123
+967773-123-123
+212 627-024321
+212689-881234
+966 54 666 4373
The numbers above cover 99% of the cases. I would appreciate any help, thanks and regards

I would just use:
^(?=(?:[+ -]*[0-9][+ -]*){11,12}$)\+(?:[0-9]+[ -]?)+[0-9]$
Explanation:
(?=(?:[+ -]*[0-9][+ -]*){11,12}$) Positive lookahead which checks that the string has exactly 11 or 12 digits in it.
\+(?:[0-9]+[ -]?)+[0-9] Has to start with a + and end with a digit, in between can be groups of one ore more digits plus optionally a single or -.
regex101 demo

^\+([\s\-0-9]){6,14}$
This would catch all your entries. It would be easier if you delete all whitespaces and unwanted characters and test than. Especially when the String to test becomes longer and longer because of whitespaces.

Related

O365 DLP custom regex

I am trying to create a custom regex to detect social security numbers in O365 DLP. The conditions are the first three digit number should not started from 000 or 666 or 150 and the last ending four digit numbers should not end with 0000. Therefore i came up with the regex below,
(?!000|666|150)\d{3}-\d{2}-(?!0000)\d{4} - This works fine
Need Solution:
what if i want to exclude the same pattern if it starts by a word say for an example Apple: 173-12-9878 or Content: 173-12-9878, i tried adding the word into the negative lookahead like
(?!Apple: |Content: )(?!000|666|150)\d{3}-\d{2}-(?!0000)\d{4}, but am not able to get this work.
Please advise and also suggest if there is a better way to achieve this. Thanks.
Use a regex with a lookbehind:
\b(?<!Apple: |Content: )(?!0{2}|666|150)\d{3}-\d{2}-(?!0{4})\d{4}\b
See proof & explanation.
The (?<!Apple: |Content: ) negative lookbehind will prevent matches after Apple: and Content:.
Note \b is word boundary, it will disallow matches of longer numbers than you expect.

Regex mask last 4 numbers

R.replace(/[0-9](?!([0-9]{4}))/g,'*','123456789');
yields 12345****
want to input 123-45-6789 and yield 123-45-****
Currently based on above it yields ***-**-****
No idea why. I am using rambda js to simulate.
http://ramdajs.com/docs/#replace
need help to construct the regex for that . Any help is appreciated
Your current regex matches any digit that doesn't have four other digits immediately following it. Which is the case for every digit in the string 123-45-6789.
If the last four characters of the strings you are working with are always digits you could easily do this without a regex.
But if you want a simple regex, you could search with the following regex and replace with ****.
\d{4}$
Note that this regex wont match anything if the string doesn't end with four digits. So it would match the first three of the examples below and fail the last three.
12-345-6789
123-45-6789
123456789
1-2-3-4-5-6-7-8-9
12-34-56-78-9
123-456-789
If you want a regex that will work in all six cases you could use this:
\d(?=(?:\D*\d){0,3} *$)
R.replace(/\d(?=(?:\D*\d){0,3} $)/g,'','123-45-6789'); worked perfectly. Thanks heaps. Kudos to Francis !

Regular expression to match a certain number of digits anywhere in a string

I'm trying to use angular's ng-pattern attribute to enforce that the text in an input box matches a particular regular expression. I'm doing this for form validation. The input I'm using this on is a phone field. The phone field can accept 10 digit phone numbers but I don't want to require a specific format from my users other than it must contain a 10 digit number in there somewhere. So these would both be valid.
555-555-5555
(555) 555-5555
On the backend, I would just remove all formatting and store the raw digits. In the past for this what I've done is to remove all non-numeric characters and then just made sure the length == 10. It's simple enough to do in a couple of lines of code, but is it something regular expressions can handle? This isn't something I've ever tried to make a regular expression do. I don't want to support specific formats because I don't care if they accidentally enter an extra space or if they want to type their phone number like this: 55-55-55-55-55. It really doesn't matter to me, I just want the regex to match if there are 10 digits and no more somewhere in the string.
Thanks for the help guys!
To allow just 10 digits in a string with a regex, no more no less, you can use
^(?:\D*\d){10}\D*$
See demo (\D replaced with [^\d\n] to exclude newline for demo only).
The (\d\D*?){10} regex will find the match in a string with more than 10 digits.
^(?!(?:.*?\d){11,})[^a-zA-Z\n]+$
Try this.See demo.
https://regex101.com/r/iQ4nW0/1
You can make attribute type directive for it and set validity with dynamic regular expression.

How to extract a numeric substring from a string but only if the previous string part matches a target

So I am trying to extract defect numbers from changeset comments in TFS. However, there are several ways people have entered the numbers:
"Defect 1321: blah blah blah"
"Fixes HPQC 1427. Logic modified"
"- Bug 976 - Customer"
I am not great with regexes so any help would be great. I prepare the string ahead of time by tolowering it and stripping out the # and ., so I can be assured I am looking for something that starts with (defect|hpqc|bug) has an optional space (\s) then a number (\d) then ends with a space (\s) but this didn't work:
(defect|hpqc|bug)\s\d\s
I only want to find the first match.
I want to extract the numeric component but only if the previous word is a match.
I am sure this is a result of my trivial knowledge of regex creation.
Case matters (usually) and you want more than one digit \d+ and there is an optional number sign too so something like this should work, depending on your system:
(Defect|HPQC|Bug)\s*#?\s*(\d+)
This allows spaces and # or neither before the digits, and captures the digits. It would help to know if you are using python or something else (tag your question).
I believe this regex should work for you:
(?:defect|hpqc|bug)\s+(\d+)\s+
Defect/Bug # is available in matched group #1
If you are looking only for the number after the keyword here is a regex might should help...
(?<=(Defect|HPQC|Bug)\s*#?\s*)\d+
Good Luck!
I precise Beroe response :
(?:Defect|HPQC|Bug)\s*\#?\s*(\d+)`
(?:Defect|HPQC|Bug) : detect but don't capture
\# : slash for disable the comment
It works for me on Expresso

TextMate: Regex replacing $1 with following 0

I'm trying to fix a file full of 1- and 2-digit numbers to make them all 2 digits long.
The file is of the form:
10,5,2
2,4,5
7,7,12
...
I've managed to match the problem numbers with:
(^|,)(\d)(,|$)
All I want to do now is replace the offending string with:
${1}0$2$3
but TextMate gives me:
10${1}05,2
Any ideas?
Thanks in advance,
Ross
According to this, TextMate supports word boundary anchors, so you could also search for \b\d\b and replace all with 0$0. (Thanks to Peter Boughton for the suggestion!)
This has the advantage of catching all the numbers in one go - your solution will have to be applied at least twice because the regex engine has already consumed the comma before the next number after a successful replace.
Note: Tim's solution is simpler and solves this problem, but I'll leave this here for reference, in case someone has a similar but more complex problem, which using lookarounds can support.
A simpler way than your expression is to replace:
(?<!\d)\d(?!\d)
With:
0$0
Which is "replace all single digits with 0 then itself".
The regex is:
Negative lookbehind to not find a digit (?<!\d)
A single digit: \d
Negative lookahead to not find a digit (?!\d)
Single this is a positional match (not a character match), it caters for both comma and start/end positions.
The $0 part says "entire match" - since the lookbehind/ahead match positions, this will contain the single digit that was matched.
To anyone coming here, as #Amarghosh suggested, it's a bug, or intentional behavior that leads to problems if nothing else.
I just had this problem and had to use the following workaround: If you set up another capture group, and then use a conditional insertion, it will work. For example, I had a string like <WebObject name=Frage01 and wanted to replace the 01 with 02, so I captured the main string in $1 and the end number in $2, which gave me a regex that looked like (<WebObject name=(Frage|Antwort))(01).
Then the replace was $1(?2:02).
The (?2:02) is the conditional insertion, and in this instance will always find something, but it was necessary in order to work around the odd conundrum of appending a number to the end of $n. Hope that helps someone. There is documentation on the conditional insertion here
In TextMate 1.5.11 (1635) ${1} does not work (like the OP described).
I appreciate the many suggestions re altering the query string, however there is a much simpler solution, if you want to break between a capture group and a number: \u.
It is a TextMate specific replacement syntax, that converts the following character to uppercase. As there is no uppercase for numbers, it does nothing and moves on. It is described in the link from Tim Pietzcker's answer.
In my case I had to clean up a csv file, where box measurements were given in cm x cm x mm. Thus I had to add a zero to the first two numbers.
Text: "80 x 40 x 5 mm"
Desired text: "800 x 400 x 5 mm"
Find: (\d+) x (\d+) x (\d+)
Replace: $1\u0 x $2\u0 x $3 mm
Regarding the support of more than 10 capture groups, I do not know if this is a bug. But as OP and #rossmcf wrote, $10 is replaced with null.
You need not ${1} - replace strings support only up to nine groups maximum - so it won't mistake it for $10.
Replace with $10$2$3