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

Вы можете сделать это следующим образом:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));
20
задан Chad Birch 3 April 2009 в 22:08
поделиться

4 ответа

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

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)

33
ответ дан 29 November 2019 в 20:25
поделиться

Сделайте группу с круглыми скобками, затем получите ее от 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, является целым соответствием)

3
ответ дан 29 November 2019 в 20:25
поделиться

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

Так, Ваш regexp мог бы быть похожим: Имя пользователя: ([^].. [^.])

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

2
ответ дан 29 November 2019 в 20:25
поделиться

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

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

Оператор положительного просмотра назад: (? <= 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», которым предшествует «User Name:», без замены самого «User Name:», которое не возвращается регулярным выражением, а только совпадает.

ВЫХОД: Имя учетной записи: имя Фамилия; Имя пользователя: Джеймс Бонд

То есть, если на вашем языке re using поддерживает такие операции

6
ответ дан 29 November 2019 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: