Regex mask last 4 numbers - regex

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 !

Related

How to allow only WhatsApp format numbers in a 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.

Get last characters up to specific character

Lets say I have a string something-123.
I need to get last 5 (or less) characters of it but only up to - if there is one in the string, so the result would be like thing, but if string has no - in it, like something123 then the result would be ng123, and if string is like 123 then the result would be 123.
I know how to mach last 5 characters:
/.{5}$/
I know how to mach everything up to first -:
/[^-]*/
But I can not figure out how to combine them, and to make things worse I need to get the match without extracting it from specific groups and similar advanced regex stuff because I want to use it in SQL Anywhere, please help.
Tank you all for the help, but looks like a complete regex solution is going to be too complicated for my problem, so I did it very simple: SELECT right(regexp_substr('something-123', '[^-]*'), 4).
One option is to group the result:
(.{4})-
Now you have captured the result but without the -.
Or using lookarounds you can:
.{4}(?=-)
which matches any 4 characters that appears before "-".
You can use:
.{5}(?=(?:-[^-]*)?$)
See the regex demo
We match 5 symbols other than a newline only before the last - in the string or at the very end of the string ((?=(?:-[^-]*)?$)). You only need to collect the matches, no need checking groups/submatches.
UPDATE
To match any 1 to 5 characters other than a hyphen before the first hyphen (if present in the string), you can use
([^-]{1,5})(?:(?:-[^-]*)*)?$
See demo. We rely on a lookahead here, that checks if there are -+non-hyphen sequences are after the expected substring.
An faster alternative:
^[^-]*?([^-]{1,5})(?:-|$)
This regex will search for any characters other than - up to 1 to 5 such characters.
Note that here, the value we need is in Group 1.
How about:
(.{5})(?:-[^-]+)?$
The result is in group 1
Try this regex:
(.{1,5})(?:-.*|$)
Group 1 has the result you need
demo

Regex format with numbers and one letter

I would like to know how to create a regex pattern in format:
111.222-3M
and
1112223M
What are numbers are only numbers allowed, and last one is a letter only.
Thx in advance.
A strict, case-sensitive version:
\d{3}\.?\d{3}-?\d[A-Z]
Will match 1112223M, 111.222-3M, 111.2223M and 111222-3M. If the last two are undesirable:
(\d{3}\d{3}\d[A-Z])|(\d{3}\.\d{3}-\d[A-Z])
Will match only the first two.
If those really are the only two patterns to match, this will work:
^\d+\.?\d+\-?\d+[a-zA-Z]$
As #ThomSmith stated, this regex will match numbers with the decimal and hyphen in different locations as well, such as 11.12-2223M. If that is undesirable, let me know.
EDIT:
If those patterns are exactly the same as the ones you want to match, this is a better one:
^\d{3}\.?\d{3}\-?\d[a-zA-Z]$

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

Regex Expression to Match this: 090129 YBB 100

Writing a quick app to help me filter text files.
I'm reading in a text file line-by-line, and need to match a series of characters that looks like this: 090129 YBB 100
The first set, 090129, will be 6 numbers (0-9). Followed by a space, and then YBB - always. After that, another space, then 2-3 numbers (0-9).
This pattern will always be the first part of the string as well.
Here's my hack at it:
^[0-9][0-9][0-9] (YBB) [0-9][0-9][0-9]\b
Of course, doesn't work... but I'm a regex noob. Thanks in advance!
Here goes:
^([\d]{6})\s(?:YBB)\s([\d]{2,3})\b
Explanation:
a) Start at start of line.
b) Match 6 digits. Save into backref 1.
c) Match a space.
d) Match "YBB". Don't save into backref.
e) Match a space.
f) Match 2-3 digits. Save into backref 2.
Of course, it's important to know which part of this pattern you want to retrieve into a backreference. If you provide that info, I can edit my post.
In Perl, I'd do:
^(\d{3}) YBB (\d{2,3})$
This webtool might be able to help you: http://www.txt2re.com/
For this case in particular: http://www.txt2re.com/index-javascript.php3?s=090129%20YBB%20100&-23&12&19&13&16&18&20&7&-3&8&17&14&15
You say there will be 6 digits before YBB, but the regex you show has only 3.