Regex - add a zero after second period

Viewed 83

I have the following example of numbers, and I need to add a zero after the second period (.).

1.01.1  
1.01.2  
1.01.3  
1.02.1  

I would like them to be:

1.01.01  
1.01.02  
1.01.03  
1.02.01

I have the following so far:

Search:

^([^.])(?:[^.]*\.){2}([^.].*)

Substitution:

0\1

but this returns:
01 only.

I need the 1.01. to be captured in a group as well, but now I'm getting confuddled.

Does anyone know what I am missing?
Thanks!!

4 Answers

You may try this regex replacement with 2 capture groups:

Search:

^(\d+\.\d+)\.([1-9])

Replacement:

\1.0\2

RegEx Demo

RegEx Details:

  • ^: Start
  • (\d+\.\d+): Match 1+ digits + dot followed by 1+ digits in capture group #1
  • \.: Match a dot
  • ([1-9]): Match digits 1-9 in capture group #2 (this is to avoid putting 0 before already existing 0)
  • Replacement: \1.0\2 inserts 0 just before capture group #2

Using your pattern, you can use 2 capture groups and prepend the second group with a dot in the replacement like for example \g<1>0\g<2> or ${1}0${2} or $10$2 depending on the language.

^((?:[^.]*\.){2})([^.])
  • ^ Start of string
  • ((?:[^.]*\.){2}) Capture group 1, match 2 times any char except a dot, then match the dot
  • ([^.].*) Capture group 2, match any char except a dot

Regex demo

A more specific pattern could be matching the digits

^(\d+\.\d+\.)(\d)
  • ^ Start of string
  • (\d+\.\d+\.) Capture group 1, match 2 times 1+ digits and a dot
  • (\d) Capture group 2, match a digit

Regex demo

For example in JavaScript

const regex = /^(\d+\.\d+\.)(\d)/;
[
  "1.01.1",
  "1.01.2",
  "1.01.3",
  "1.02.1",
].forEach(s => console.log(s.replace(regex, "$10$2")));

You could try:

^([^.]*\.){2}\K

Replace with 0. See an online demo

  • ^ - Start line anchor.
  • ([^.]*\.){2} - Negated character 0+ times (greedy) followed by a literal dot, matched twice.
  • \K - Reset starting point of reported match.

EDIT:

Or/And if \K meta escape isn't supported, than see if the following does work:

^((?:[^.]*\.){2})

Replace with ${1}0. See the online demo

  • ^ - Start line anchor.
  • ( - Open 1st capture group;
    • (?: - Open non-capture group;
      • `Negated character 0+ times (greedy) followed by a literal dot.
      • ){2} - Close non-capture group and match twice.
    • ) - Close capture group.

Obviously, there will be tons of solutions for this, but if this pattern holds (i.e. always the trailing group that is a single digit)... \.(\d)$ => \.0\1 would suffice - to merely insert a 0, you don't need to match the whole thing, only just enough context to uniquely identify the places targeted. In this case, finding all lines ending in a . followed by a single digit is enough.

Related