Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex - add a zero after second period

Tags:

regex

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!!

like image 331
Brendonius Avatar asked Apr 19 '21 06:04

Brendonius


3 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
like image 94
anubhava Avatar answered Nov 15 '22 16:11

anubhava


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.
like image 23
JvdV Avatar answered Nov 15 '22 14:11

JvdV


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")));
like image 29
The fourth bird Avatar answered Nov 15 '22 15:11

The fourth bird