Подтвердить что ты не робот

Возврат только части соответствия из регулярного выражения

Скажите, что у меня есть строка "Имя пользователя: firstname.surname", содержащаяся в большей строке. Как я могу использовать регулярное выражение, чтобы просто получить имя firstname.surname?

Каждый метод, который я попробовал, возвращает строку "Имя пользователя: firstname.surname", тогда мне нужно заменить строку на "Имя пользователя:" на пустую строку.

Можно ли использовать обратные ссылки здесь?

Edit:

Более длинная строка может содержать "Имя учетной записи: firstname.surname", поэтому я хочу совместить часть "Имя пользователя:" и просто получить это значение.

4b9b3361

Ответ 1

Мне нравится использовать именованные группы:

Match m = Regex.Match("User Name:first.sur", @"User Name:(?<name>\w+\.\w+)");
if(m.Success)
{
   string name = m.Groups["name"].Value;
}

Ввод ?<something> в начале группы в круглых скобках (например, (?<something>...)) позволяет получить значение из соответствия, используя something в качестве ключа (например, от m.Groups["something"].Value)

Если вы не хотите идти на поводу именовать свои группы, вы можете сказать

Match m = Regex.Match("User Name:first.sur", @"User Name:(\w+\.\w+)");
if(m.Success)
{
   string name = m.Groups[1].Value;
}

и просто получите первое, что соответствует. (Обратите внимание, что первая группа в скобках указана в индексе 1, а все выражение соответствует индексу 0)

Ответ 2

Вы также можете попробовать концепцию "lookaround". Это своего рода утверждение с нулевой шириной, то есть оно будет соответствовать символам, но не приведет к их результату.

В вашем случае мы могли бы взять положительный взгляд: мы хотим, чтобы за целевой строкой "firstname.surname" была равна "User Name:".

Положительный оператор lookbehind: (? <= StringBehind) StringWeWant

Это может быть достигнуто, например, (например, небольшой пример 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", которые предшествуют "Имя пользователя:", без замены самого "Имя пользователя:", которое не возвращается регулярным выражением, только согласовано.

OUTPUT: имя учетной записи: firstname.surname; Имя пользователя: James.Bond

То есть, если используемый вами язык поддерживает такие операции

Ответ 3

Все библиотеки регулярных выражений, которые я использовал, позволяют вам определять группы в регулярном выражении с помощью круглых скобок, а затем получать доступ к этой группе из результата.

Итак, ваше регулярное выражение может выглядеть так: Имя пользователя: ([^.]. [^.])

Полное совпадение - это группа 0. Часть, которая находится внутри круглых скобок, - это группа 1.

Ответ 4

Сделайте группу с скобками, затем получите ее из коллекции Match.Groups, например:

string s = "User Name:firstname.surname";
Regex re = new Regex(@"User Name:(.*\..*)");
Match match = re.Match(s);
if (match.Success)
{
    MessageBox.Show(match.Groups[1].Value);
}

(примечание: первая группа с индексом 0 является полным совпадением)