Указав $
, вы по существу соответствует последнему вхождению в конце строки. Если вы хотите сопоставить первое вхождение, удалите $
или укажите, что ожидается новая строка:
"^(?<pre>.+)(\|\d\.\d{1,2})"
или
"^(?<pre>.+)(\|\d\.\d{1,2})[\r\n]"
Исходя из вашего комментария об использовании Multiline и внешнего вида ваших тестовых данных, я полагаю, что вы вводите в несколько строк. Используйте вышеуказанный шаблон и попробуйте это:
Dim input As String = "dsfdsaf|2.1" & Environment.NewLine & _
"wretdfg|2.2" & Environment.NewLine & _
"sdafasd3|2.3"
Console.WriteLine("Before:")
Console.WriteLine(input)
Console.WriteLine("After:")
Console.WriteLine(SetVersion(input, "2.4"))
2,1 должен измениться на 2,4.