Regex - Escape персонаж - PullRequest
       6

Regex - Escape персонаж

3 голосов
/ 08 октября 2019

У меня есть это регулярное выражение: (?:\[|\G(?!^))('[^']+?')\s*,?\s*(?=[^\]]*?\]), которое соответствует только содержанию между кавычками в квадратных скобках (например, массивом): ['Foo', 'Bar'] => возвращает 'Foo' 'Bar'.

Проблемав этом случае одиночная кавычка является специальным символом, так как она используется регулярным выражением в качестве разделителя, но мне необходимо иногда передавать одиночную кавычку внутри значения в качестве экранированного символа: ['F'oo', 'B'ar'].

Я пытаюсь сделать что-то наподобие 'F \' oo ', адаптировав эту группу без захвата (?:(?=(\\?))\1.) к регулярному выражению, но это не работает, я пробовал много разных способов.

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

Я использую C # с .NET Core.

полный текст что-то вроде: eq('Property', ['F'oo', 'Ba'r', '123'])

Как это можно решить?

Ответы [ 3 ]

3 голосов
/ 10 октября 2019

Уже есть подобный вопрос для получения экранированных символов в кавычках. Я бы предпочел этот ответ .

Измените свою часть захвата ('[^']+?') на ('[^\\']*(?:\\.[^\\']*)*'). Вы также можете отбросить ленивый квантификатор, который не будет иметь большого значения, если вы уже используете отрицательный класс.

Может потребоваться дополнительная экранирование обратной косой черты .

2 голосов
/ 10 октября 2019

Вы можете использовать

(?:\[|\G(?!\A))
('.+?')
(?:(?:\s*,\s*)|\])

См. демо на regex101.com .

0 голосов
/ 10 октября 2019

Я предполагаю, что, возможно,

(?<=\[|,)\s*'(.*?)'\s*(?=\]|,)

или какое-либо выражение, подобное этому, может работать хорошо.

Демонстрация

Тест

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(?<=\[|,)\s*'(.*?)'\s*(?=\]|,)";
        string input = @"['Foo', 'Bar']
['F'oo', 'B'ar']
['F'oo', 'B'ar','Foo', 'Bar']";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

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