Regex - сопоставлять кавычки в скобках - PullRequest
0 голосов
/ 30 сентября 2019

Пример строки:

cov ('Age', ['5', '7', '9'])

У меня есть этот RegEx, который соответствуетзначения внутри кавычек:

(["'])(?:(?=(\\?))\2.)*?\1

Я пытаюсь изменить его, чтобы возвращать только кавычки в квадратных скобках из строки примера, используя lookahead / lookbehind:

(?<=\[)(["'])(?:(?=(\\?))\2.)*?\1(?=\])

Но этосоответствует всем в квадратных скобках.

Как сопоставить только кавычки без запятых, как в первом регулярном выражении, но внутри квадратных скобок?

Редактировать.

язык .NET.

Ответы [ 3 ]

3 голосов
/ 30 сентября 2019

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

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

Смотрите здесь регулярное выражение

\[('[^']*'[,\]])+(?<=])

Для большинства других языков (не охваченных этим ответом или @ Thefourthbird's ), вы 'Я захочу сделать это в два этапа:

  • Получить все строки, которые соответствуют \[([^[\]]*)] (вам нужно значение группы 1)
  • Соответствовать всем вхождениям '([^']*)' (выхотите значение группы 1 для содержимого)
3 голосов
/ 30 сентября 2019

Один из поддерживаемых вариантов - использование якоря \G и группы захвата:

(?:\[|\G(?!^))('[^']+'),?(?=[^\]]*\])

По частям

  • (?: Группа без захвата
  • \[ Открытие матча [
    • | Или
    • \G(?!^) Подтверждение позиции в конце предыдущего матча
  • ) Закрыть группу без захвата
  • ( Группа захвата 1
    • '[^']+' Совпадение ', 1+ раз с любым символом, кроме ', затем совпадение 'снова
  • ) Закрыть группу 1
  • ,? Соответствовать необязательному ,
  • (?=[^\]]*\]) Позитивный прогноз, подтвердить закрытие ]

Regex demo | C # демо

Например

string pattern = @"(?:\[|\G(?!^))('[^']+'),?(?=[^\]]*\])";
string input = @"cov('Age', ['5','7','9'])";

var results = Regex.Matches(input, pattern)
.Cast<Match>()
.Select(m => m.Groups[1].Value)
.ToArray();

foreach(string result in results)
{
    Console.WriteLine(result);
}

Выход

'5'
'7'
'9'
0 голосов
/ 04 октября 2019

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

Дано

var text = "cov('Age', ['5','7','9'])";

Подходы могут быть следующими:

// Split captured text with ' and , 
var results = Regex.Matches(text, @"\[([^][]+)]")
        .Cast<Match>()
        .Select(x => x.Groups[1].Value.Split('\'', ',').Where(c => !string.IsNullOrEmpty(c)));

Или сопоставить строки в скобках, а затем извлечь из них все 1+-значные куски:

var results1 = Regex.Matches(text, @"\[([^][]+)]")
        .Cast<Match>()
        .Select(x => Regex.Matches(x.Groups[1].Value, @"\d+"));

Или просто извлечьвсе числа внутри [...]:

var results = Regex.Matches(text, @"(?<=\[[^][]*)\d+(?=[^][]*])").Cast<Match>().Select(x => x.Value);

Здесь регулярное выражение соответствует

  • (?<=\[[^][]*) - позиции, которой предшествует [ и любаяколичество символов, отличных от [ и ]
  • \d+ - 1+ цифр
  • (?=[^][]*]) - позиция с любыми 0+ символами, кроме [ и ] а затем ].

См. онлайн-демонстрацию C # .

Это становится немного более сложным дляизвлечь любое число , заменить \d+ на [-+]?\d*\.?\d+([eE][-+]?\d+)?

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