RegEx захвата групп в C # - PullRequest
2 голосов
/ 18 мая 2019

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

Регулярное выражение, которое я пытаюсь использовать:

string regex = @"^(?<key>\w+?)\s*?:\s*?{(?<value>[\s\S]+?)}$";

и текст, с которым я пытаюсь разобраться, -

string text = @"key:{value}
key:{valu{0}e}
key:{valu
{0}e}
key:{val-u{0}e}
key:{val__[!]
-u{0}{1}e}";

Тем не менее, он возвращает 0 результатов

MatchCollection matches = Regex.Matches(text, regex, RegexOptions.Multiline);

Я пытался протестировать это регулярное выражение на RegExr , который работал как ожидалось.
Я не уверен, почему это не работает при попытке в C #.

MCVE:

string regex = @"^(?<key>\w+?)\s*?:\s*?{(?<value>[\s\S]+?)}$";
string text = @"key:{value}
key:{valu{0}e}
key:{valu
{0}e}
key:{val-u{0}e}
key:{val__[!]
-u{0}{1}e}";
MatchCollection matches = Regex.Matches(text, regex, RegexOptions.Multiline);
Console.WriteLine(matches.Count);

1 Ответ

3 голосов
/ 18 мая 2019

Один из способов, который мы могли бы попробовать, это проверить, работает ли наше выражение на другом языке.

Кроме того, мы можем упростить наше выражение:

^(.*?)([\s:]+)?{([\s\S].*)?.$

, где у нас есть три группы захвата.Первый и третий - наш желаемый ключ и ценности.

enter image description here

RegEx

Вы можете изменять / упрощать / изменять выражения в regex101.com .

RegEx Circuit

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

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

const regex = /^(.*?)([\s:]+)?{([\s\S].*)?.$/gm;
const str = `key:{value}
key:{valu{0}e}
key:{valu
{0}e}
key:   {val-u{0}e}
key:  {val__[!]
-u{0}{1}e}`;
const subst = `$1,$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

C # Test

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^(.*?)([\s:]+)?{([\s\S].*)?.$";
        string substitution = @"$1,$3";
        string input = @"key:{value}
key:{valu{0}e}
key:{valu
{0}e}
key:   {val-u{0}e}
key:  {val__[!]
-u{0}{1}e}";
        RegexOptions options = RegexOptions.Multiline;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}

Original RegEx Test

const regex = /^(?<key>\w+?)\s*?:\s*?{(?<value>[\s\S]+?)}$/gm;
const str = `key:{value}
key:{valu{0}e}
key:{valu
{0}e}
key:   {val-u{0}e}
key:  {val__[!]
-u{0}{1}e}`;
const subst = `$1,$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Ссылки:

...