Regex positive look behind notepad++ - regex

I'm trying to use regex to grab the last 3 digits of a string that varies in size. The beginning of the string always leads with name-
Examples:
"Name-0000425"
"Name-00123"
"Name-123"
I want the regex to grab the last 3 digits of this number and replace it with these digits. This is the regex I have tried but it only grabs the first 3 digits.
(?-s)(?<=Name-)(\d{3})
Any help would be appreciated! Thanks!

You can use
(?<=Name-)\d*(\d{3})
Replace with $1. See the regex demo.
Alternatively, you may also use (Name-)\d*(\d{3}) and replace with $1$2.
Details
(?<=Name-) - a positive lookbehind that matches a location immediately preceded with Name-
\d* - any zero or more digits
(\d{3}) - Group 1 ($1 refers to this value from the replacement pattern): three digits.
NOTES
If you only want to remove initial zeros, you can use the (?<=Name-)0+(\d{3}) regex.
If there can be anything else before the last three digits on the line, you may use (?<=Name-).*(\d{3}).
If there can be anything else before the last three digits that are inside double quotes on a single line, you may use (?<=Name-)[^"\n\r]*(\d{3}).

Shortest regex will be...
Find what: \d{3}"
Replace it with 789"

Related

Regex stopped matching after the first match

I need some help here
Here is example of what im trying to match:
1 ScreenMail Enable friendly none Internal any 5
I need to match everything excluding the last digits (5) Meaning matching the first digit(1), spaces, letter, special characters, etc I tried using /^(\d), but after matching the first digits, it stopped. Your assistance would be appreciated.
The simplest way is probably to remove last digits with:
\d+$
\d+\s*$
See the regex demo.
You may want to use a matching regex like
^.*[^\d\s]
that matches any zero or more chars other than line break chars (.*) as many as possible and then a char other than a digit and whitespace. See this regex demo.
However, if the digits are followed with an optional whitespace, or if you allow any text after the last digits, it will fail. You can then use
^.*[^\d\s](?=\s*\d)
See this regex demo. The (?=\s*\d) positive lookahead requires zero or more whitespaces and then a digit immediately to the right of the current location.

Regex to find where space is missing between number and word

I am using regex to clean some text files.
In some places, spaces are missing as in the second line below:
1.9 Beef Curry
1.10Banana Pie
1.11 Corn Gravy
I need an expression to find a zero-length match at the position between 0 and B, so that I can replace it (in Notepad++) with a space. Note that numerators can be one or two digits, and there can also be one (i.e. 1. Exotic Disches) or three levels (i.e. 2.5.1 Chicken).
Can someone please give the answer?
I would have thought one of the following should work, but Notepad++ calls it invalid. Would also appreciate it if someone can tell my why...
(?<=\.\d\d|\.\d)(?! )(?!\.)
(?<=\.\d{1,3)(?! )(?!\.)
Thanks in advance!
Maybe it is enough, just to look for the zero length spaces \B (non word boundaries) between word characters and check, if preceded by a digit and not followed by a digit. If so, replace with space.
\B(?<=\d)(?!\d)
See this demo at regex101
at any \B non word boundary
(?<=\d) looks behind for a digt
(?!\d) looks ahead for no digit
For further restricting the digit part to dot, followed by 1-3 digits, try something like \.\d{1,3}\B\K(?!\d) where \K resets beginning of the reported match. Or without \K and replace by $0
Just to mention: Also the underscore belongs to word characters. If your input contains underscores, e.g. something like 1_ and you don't want to add space here, change the lookahead to (?![\d_])
You may use one of
^\d[\d.]*+(?!\h)
^\d[\d.]*+(?! )
^(?>\d+(?:\.\d+)*\.?)(?!\h)
Replace with $& .
Settings and test:
Details
^\d[\d.]*+(?!\h) matches a digit and then 0 or more digits/dots and once they are all matched, a horizontal whitespace is checked for. If there is no whitespace, there is a match.
^\d[\d.]*+(?! ) is the same, just the check is performed for a regular space.
^(?>\d+(?:\.\d+)*\.?)(?!\h) is more specific, it matches
^ - start of line
(?>\d+(?:\.\d+)*\.?) - an atomic group preventing backtracking:
\d+ - 1+ digits
(?:\.\d+)* - 0 or more sequences of . and 1+ digits
\.? - an optional dot
(?!\h) - no horizontal whitespace allowed immediately on the right
My alternative attempt also working
Find what: ^(\d\.\d+) ?(?=\w)
Replace with: $1 a space after $1

Regex help! Need to strip down a string to digits-only

Let's say I've have the string ">=3.0.0". Regex: [^\D](\S+\d+) helps to strip it down to 3.0.0 (https://regex101.com/r/XUxyEM/1). But when I've the string ">=6" Regex [^\D](\S+\d+) will return an empty result (https://regex101.com/r/XUxyEM/2) whilst I want to have 6 as result. How to change my regex so that it works for both cases. Sorry, I'm kind of a regex-newbie.
If you want to capture digit followed with any amount of digit and dots after any amount of non-digits, use
\D*(\d[\d.]*)
See the regex demo
The following regex
\d[\d.]*$
will match a digit followed with 0+ digits and/or dots at the end of the string. See another demo.

Notepad++ Replace regex match for same text plus appending character

I have a file with text and numbers with a length of five (i.e. 12000, 11153, etc.). I want to append all of these numbers with a 0. So 11153 becomes 111530. Is this possible in Notepad++?
I know I can find all numbers with the following regex: [0-9]{5}, but how can I replace these with the same number, plus an appending 0?
In the replacement box I tried the following things:
[0-9]{5}0 - Which it took literally, so 11153 was replaced with [0-9]{5}0
\10 - I read somewhere that \1 would take the match, but it doesn't seem to work. This will replace 11153 with 0
EDIT: \00 - Based on this SO answer I see I need to use \0 instead of \1. It still doesn't work though. This will replace 11153 with
So, I've got the feeling I'm close with the \1 or \0, but not close enough.
You are very near to the answer! What you missed is a capturing group.
Use this regex in "Find what" section:
([0-9]{5})
In "Replace with", use this:
\10
The ( and ) represent a capturing group. This essentially means that you capture your number, and then replace it with the same followed by a zero.
You are very close. You need to add a capturing group to your regex by surrounding it with brackets. ([0-9]{5})
Then use \10 as the replacement. This is replacing the match with the text from group 1 followed by a zero.
You can use \K to reset.
\b\d{5}\b\K
And replace with 0
\b matches a word boundary
\d is a short for digit [0-9]
See demo at regex101

Regular expression to match last number in a string

I need to extract the last number that is inside a string. I'm trying to do this with regex and negative lookaheads, but it's not working. This is the regex that I have:
\d+(?!\d+)
And these are some strings, just to give you an idea, and what the regex should match:
ARRAY[123] matches 123
ARRAY[123].ITEM[4] matches 4
B:1000 matches 1000
B:1000.10 matches 10
And so on. The regex matches the numbers, but all of them. I don't get why the negative lookahead is not working. Any one care to explain?
Your regex \d+(?!\d+) says
match any number if it is not immediately followed by a number.
which is incorrect. A number is last if it is not followed (following it anywhere, not just immediately) by any other number.
When translated to regex we have:
(\d+)(?!.*\d)
Rubular Link
I took it this way: you need to make sure the match is close enough to the end of the string; close enough in the sense that only non-digits may intervene. What I suggest is the following:
/(\d+)\D*\z/
\z at the end means that that is the end of the string.
\D* before that means that an arbitrary number of non-digits can intervene between the match and the end of the string.
(\d+) is the matching part. It is in parenthesis so that you can pick it up, as was pointed out by Cameron.
You can use
.*(?:\D|^)(\d+)
to get the last number; this is because the matcher will gobble up all the characters with .*, then backtrack to the first non-digit character or the start of the string, then match the final group of digits.
Your negative lookahead isn't working because on the string "1 3", for example, the 1 is matched by the \d+, then the space matches the negative lookahead (since it's not a sequence of one or more digits). The 3 is never even looked at.
Note that your example regex doesn't have any groups in it, so I'm not sure how you were extracting the number.
I still had issues with managing the capture groups
(for example, if using Inline Modifiers (?imsxXU)).
This worked for my purposes -
.(?:\D|^)\d(\D)