Группировка строк с использованием регулярных выражений - PullRequest
1 голос
/ 23 мая 2019

У меня есть строка ниже

validates="required positiveInteger" label="Enter the Total Value." name="totalvalue" visibleif="hasvalue:Yes"

Таким образом, строка имеет 4 атрибута validates, label, name и visibleif с соответствующим значением

Я использую Утилита регулярных выражений dotliquid для группировки атрибутов.В приведенном ниже методе initialize значение параметра markup является приведенной выше строкой.

public class TextBox : DotLiquid.Tag
{
    //R.B and R.Q are dotliquid's utility method
    private static readonly Regex Syntax = R.B(R.Q(@"(?<validation>{0}+)(\s(?<label>{0}+))?(\s(?<name>{0}+))?(\s(?<onlyif>{0}+))?"), Liquid.QuotedFragment);

    private string[] _validations;
    private string[] _label;
    private string[] _name;
    private string[] _onlyif;

    public override void Initialize(string tagName, string markup, List<string> tokens)
    {
        var syntaxMatch = Syntax.Match(markup);
        if (syntaxMatch.Success)
        {
            _validations = syntaxMatch.Groups["validation"].Value.Split("=").TrimQuotes().ToArray();
            _label = syntaxMatch.Groups["label"].Value.Split("=").TrimQuotes().ToArray();
            _name = syntaxMatch.Groups["name"].Value.Split("=").TrimQuotes().ToArray();
            _onlyif = syntaxMatch.Groups["onlyif"].Value.Split("=").TrimQuotes().ToArray();
        }
        else
        {
            throw new SyntaxException("Invalid syntax");
        }

        base.Initialize(tagName, markup, tokens);
    }

    public override void Render(Context context, TextWriter result)
    {
        base.Render(context, result);
    }
}

Код работает только с данной строкой, однако существуют проблемы:
1> Если атрибутыв другом порядке, тогда группировке присваивают неправильные значения.Атрибуты

2> name и label являются обязательными, но атрибуты validates и visibleif не обязательны.RegEx должен проверить это.

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

Может ли кто-нибудь помочь с правильным регулярным выражением?

Ответы [ 2 ]

1 голос
/ 23 мая 2019

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

(validates|label|name|visibleif)=("(.+?)")\s?

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

enter image description here

RegEx

Если это выражение нежелательно, его можно изменить или изменить в regex101.com .

Схема RegEx

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

enter image description here

Пример теста

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(validates|label|name|visibleif)=(""(.+?)"")\s?";
        string input = @"validates=""required positiveInteger"" label=""Enter the Total Value."" name=""totalvalue"" visibleif=""hasvalue:Yes""
validates=""required positiveInteger"" label=""Enter the Total Value."" name=""totalvalue"" visibleif=""hasvalue:Yes"" fail_attribute=""Undesired""";
        RegexOptions options = RegexOptions.Multiline;

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

Демо

const regex = /(validates|label|name|visibleif)=("(.+?)")\s?/gm;
const str = `validates="required positiveInteger" label="Enter the Total Value." name="totalvalue" visibleif="hasvalue:Yes"
validates="required positiveInteger" label="Enter the Total Value." name="totalvalue" visibleif="hasvalue:Yes" fail_attribute="Undesired"`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

DEMO

0 голосов
/ 23 мая 2019

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

Я предполагаю, что когда вы разделяете строку на =, вы получаете ключ и значение. Ключом является имя атрибута, поэтому в этот момент вы можете проверить, указаны ли label и value, и нет ничего, кроме label, value, validate и visibleif.

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

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