RegEx, чтобы соответствовать шаблону и исключить часть строки

На github есть открытый запрос функции, где вы можете озвучить свое мнение / желание: https://github.com/Microsoft/TypeScript/issues/16

1
задан Tunaki 28 August 2015 в 13:40
поделиться

2 ответа

Спецификация не очень ясна, но вот что я предполагаю:

  • # в начале строки находится комментарий
  • Ключ " "может содержать до 3 частей, разделенных литералом .
    • Средняя часть - это необязательный «мусор»
  • За «ключом» следует = , затем «значение»
  • . и = являются специальными маркерами, по крайней мере, до части «значение», после чего все идет
  • Разрешить пробелы

Тогда, возможно, шаблон работает примерно так:

    String text = 
        "  some.stuff.here  =    blah blah  \n" +
        "  awesome.key  =    { level = 10 }  \n" +
        "# awesome.key  =    { level = 11 }  \n" +
        "  awesome..key =    { level = 12 }  \n" +
        "  !@#$.)(*&.$%& =   a=b=c.d=f ";

    Pattern p = Pattern.compile(
        "(?m)^(?!#) (key)@(?:key@)?(key) = (value) $"
            .replace("@", "\\.")
            .replace(" ", "\\s*")
            .replace("key", "[^.=\\s]*")
            .replace("value", ".*?")
    );

    Matcher m = p.matcher(text);
    while (m.find()) {
        System.out.printf("%s.%s => [%s]%n",
            m.group(1),
            m.group(2),
            m.group(3)
        );
    }

Это печатает :

some.here => [blah blah]
awesome.key => [{ level = 10 }]
awesome.key => [{ level = 12 }]
!@#$.$%& => [a=b=c.d=f]

Обратите внимание на подход replace для генерации окончательного шаблона регулярного выражения; он используется для улучшения читабельности общей картины "картины"

0
ответ дан 2 September 2019 в 23:42
поделиться

Два подхода; первый - если ваше свойство состоит из трех элементов, просто замените первый (\S*) на:

(\S+?)\.\S+?\.(\S+)

Обратите внимание, я также заменил * на +, так как не имеет смысла иметь "..." как часть свойства, я также использовал не жадные классификаторы, но это все равно должно работать нормально без них. Затем вы можете просто использовать соответствующие номера групп для восстановления скорректированного свойства. Второй подход, предполагающий, что ваша случайная строка является шестнадцатеричным числом (что, похоже, так и есть), а неслучайные части свойства не содержат чисел:

((?:\S+.)*)(?:[0-9A-Fa-f]+.)?((?:\S+.?)+)

Итак, первая группа должна подобрать все до случайного числа (включая точку в конце строки), вторая группа съест случайное число, а третья будет подбирать оставшуюся строку (или всю, если нет части случайного числа).

EDIT

С обновленным описанием проблемы и совпадением только двух групп мой ответ - это невозможно. В регулярном выражении нет механизма "стирания" части совпадения. Из определения проблемы следует, что часть ключа, которая не должна быть включена, находится в середине другого текста, т.е. общий шаблон для соответствия таков:

((a)(?:b)(c))

Поскольку мы не можем предварительной или последующей обработки, "b" всегда будет частью большей группы соответствия, включающей a и c, тот факт, что это не совпадающая группа, не влияет на большую группу.

2
ответ дан 2 September 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: