Вы также можете попробовать концепцию «lookaround». Это своего рода утверждение нулевой ширины, означающее, что оно будет соответствовать символам, но не будет захватывать их в результате.
В вашем случае мы могли бы взглянуть позитивно: мы хотим, чтобы то, что находится за целевой строкой "firstname.surname", было равно "User Name:".
Оператор положительного просмотра: (? <= StringBehind) StringWeWant </p>
Это может быть достигнуто, например, так (небольшой пример на Java с использованием замены строки):
String test = "Account Name: firstname.surname; User Name:firstname.surname";
String regex = "(?<=User Name:)firstname.surname";
String replacement = "James.Bond";
System.out.println(test.replaceAll(regex, replacement));
Это заменяет только строки «firstname.surname», которым предшествует «User Name:», без замены самого «User Name:», которое не возвращается регулярным выражением, только сопоставляется.
ВЫХОД: имя учетной записи: имя.фамилия; Имя пользователя: James.Bond
То есть, если используемый вами язык поддерживает такие операции