Расширение [^,] +, регулярное выражение в C # - PullRequest
2 голосов
/ 26 февраля 2009

Дублирование

Regex для объявления и инициализации переменной в c #

Я искал Регулярное выражение для анализа значений CSV, и я наткнулся на это Регулярное выражение

[^,]+

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

имя_значения v1, v2, v3, v4, ...

Теперь я хочу, чтобы регулярное выражение нашло мне слова v1, v2, v3, v4 ..

Я пытался ->

^value_name\s+([^,]+)*

Но это не сработало для меня. Можете ли вы сказать мне, что я делаю не так? Я помню, как работал над регулярными выражениями и их реализацией statemachine. Разве это не работает таким же образом.

Если строка начинается с Value_name, за которым следуют один или несколько пробелов. Перейти к следующему состоянию. В этом состоянии читайте слово, пока не придет «,». Тогда сделай это снова! И каждое слово будет сгруппировано!

Я ошибаюсь, понимая это?

Ответы [ 3 ]

6 голосов
/ 26 февраля 2009

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

(?:^value_name\s+)?([^,]+)(?:\s*,\s*)?
  • Первая группа не захватывает и будет соответствовать началу строки и value_name.
    Чтобы убедиться, что регулярное выражение остается действительным для всех совпадений, мы делаем эту группу необязательной, используя измененный '?' (то есть совпадение самое большее один раз ).

  • Вторая группа захватывает и будет соответствовать вашим vXX данным.

  • Третья группа не захватывает и будет соответствовать , и любым пробелам до и после него.
    Опять же, мы делаем это необязательным, используя модификатор '?', в противном случае последняя группа 'vXX' не будет соответствовать, если мы не закончили строку с окончательным ','.

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

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

Regex r = new Regex(@"(?:^value_name\s+)?([^,]+)(?:\s*,\s*)?");
Match m = r.Match(subjectString);
while (m.Success) {
    for (int i = 1; i < m.Groups.Count; i++) {
        Group g = m.Groups[i];
        if (g.Success) {
            // matched text: g.Value
            // match start: g.Index
            // match length: g.Length
        } 
    }
    m = m.NextMatch();
} 
3 голосов
/ 26 февраля 2009

Я ожидаю, что он получит только v1 в группе, потому что первая запятая «блокирует» его захват остальных полей. То, как вы справитесь с этим, будет зависеть от методов, которые вы используете для регулярного выражения, но может иметь смысл сделать два прохода, сначала захватить все поля, разделенные запятыми, а затем разбить все на пробелы. Возможно ^value_name\s+(?:([^,]+),?)* вместо.

2 голосов
/ 26 февраля 2009

О да, списки ....

/(?:^value_name\s+|,\s*)([^,]+)/g теоретически захватит их, но вам придется использовать RegExp.exec() в цикле, чтобы получить захват, а не весь матч.

Желаю, чтобы предварительные матчи работали в JS: (.

В противном случае придерживайтесь идеи Логана: /^value_name\s+([^,]+(?:,\s*[^,]+)*)$/, затем .split (/, \ s * /);

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