Как я могу захватить несколько групп после сопоставления исходных строк с помощью регулярного выражения? [Дубликат]

Используйте parseInt (...) , но убедитесь, что вы указали значение радиуса; в противном случае вы столкнетесь с несколькими ошибками (если строка начинается с «0», радиус - восьмеричный / 8 и т. д.).

var x = parseInt(stringValueX, 10);
var y = parseInt(stringValueY, 10);

alert(x + y);

Надеюсь, что это поможет!

7
задан McArthey 15 June 2012 в 14:26
поделиться

3 ответа

Вам повезло, потому что C # - один из немногих языков (если не единственный), который поддерживает подвыражения, захватывает

https://msdn.microsoft.com/en-us/ library / system.text.regularexpressions.capture (v = vs.110)

API .NET можно посмотреть следующим образом

 Matches
     Groups (most regex engines stop here)
         Captures (unique for .NET)

Непонятно от вашего вопроса, что вы хотите точно сопоставить, но это должно вас начать. Спросите еще раз, если вы застряли.

  string input = "-group1 -group2 ";
  string pattern = @"(-\S*\W){2}";
  foreach (Match match in Regex.Matches(input, pattern))
  {
     Console.WriteLine("Match: {0}", match.Value);
     for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
     {
        Group group = match.Groups[groupCtr];
        Console.WriteLine("   Group {0}: {1}", groupCtr, group.Value);
        for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
           Console.WriteLine("      Capture {0}: {1}", captureCtr, 
                             group.Captures[captureCtr].Value);
     }                      
  } 

Это выводит

Match: -group1 -group2 
   Group 0: -group1 -group2 
      Capture 0: -group1 -group2 
   Group 1: -group2 
      Capture 0: -group1 
      Capture 1: -group2 

Как вы можете видеть (группа 1, захват 0) и (группа 1, захват 1) предлагают отдельные записи группы (а не последние, как на большинстве языков)

Этот адрес я думаю о том, что вы называете «иметь возможность обратного выделения каждого из значений отдельно»

(Вы используете термин «backreference», но я не думаю, что вы правы для замены шаблона?)

14
ответ дан Alex 21 August 2018 в 20:48
поделиться
  • 1
    +1. Я считаю, что это то, о чем он просил. В стороне PHP предлагает это с функцией preg_match_all(...); используя флаг PREG_SET_ORDER, он возвращает многомерный массив, первый массив, содержащий первый набор, второй массив, содержащий второй набор и т. д. (Другие флаги допускают разные представления.) Я предполагаю, что если .NET и PHP внедрили его, другие языки тоже. – Andrew Cheong 15 June 2012 в 14:56
  • 2
    @ acheong87 Хороший комментарий, я добавлю его в ответ, чтобы не оскорбить другие языки :) У меня есть эксперт по регулярному выражению Ян Гойвартс, что .NET был уникальным в этом аспекте, но я недостаточно активен на других платформах, чтобы поддержать это , – buckley 15 June 2012 в 15:10
  • 3
    @ acheong87, это не одно и то же. preg_match_all() повторно применяет регулярное выражение и возвращает собранные результаты, похожие на метод .NET Matches(). OP хочет выполнить один совпадение, которое будет потреблять всю строку, а затем разбить отдельные записи. .NET предоставляет CaptureCollection для этой цели, но PHP не имеет эквивалента. – Alan Moore 15 June 2012 в 16:52
  • 4
    @AlanMoore, ах, я вижу; мои извинения @buckley за вводящую в заблуждение информацию, я определенно неправильно понял. Итак, если я правильно понял, .NET CaptureCollection может действительно разделить что-то вроде /^hello, (\w+\s*)+$/, сопоставленное с «привет», john doe & quot; как "john" и "doe", тогда как PHP (и другие языки) не могут. – Andrew Cheong 15 June 2012 в 17:00
  • 5
    @AlanMoore Не беспокойтесь, я снова изменил ответ – buckley 15 June 2012 в 17:12

Попробуйте следующее:

(-.+?)(\s|$)

Ваша первая группа захвата будет иметь то, что вы хотите (-group1, -group2 и т. д.).

Если вы хотите больше контролировать что разрешить после -, измените .+? на, например, [a-zA-Z0-9]+?, чтобы соответствовать только буквенно-цифровым символам.

0
ответ дан qJake 21 August 2018 в 20:48
поделиться

С .NET regex (и почти только .NET) вы можете использовать:

(?:(-\S+)\s*)+

Группа 1 будет содержать список всех подстроенных подстрок.

Или, может быть, просто использовать Matches в вашем случае достаточно:

var re = new Regex(@"-\S+");
var matches = re.Matches(str);
2
ответ дан Qtax 21 August 2018 в 20:48
поделиться
Другие вопросы по тегам:

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