Возврат только части соответствия из регулярного выражения
Скажите, что у меня есть строка "Имя пользователя: firstname.surname", содержащаяся в большей строке. Как я могу использовать регулярное выражение, чтобы просто получить имя firstname.surname?
Каждый метод, который я попробовал, возвращает строку "Имя пользователя: firstname.surname", тогда мне нужно заменить строку на "Имя пользователя:" на пустую строку.
Можно ли использовать обратные ссылки здесь?
Edit:
Более длинная строка может содержать "Имя учетной записи: firstname.surname", поэтому я хочу совместить часть "Имя пользователя:" и просто получить это значение.
Ответы
Ответ 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 является полным совпадением)