На github есть открытый запрос функции, где вы можете озвучить свое мнение / желание: https://github.com/Microsoft/TypeScript/issues/16
Спецификация не очень ясна, но вот что я предполагаю:
#
в начале строки находится комментарий .
=
, затем «значение» .
и =
являются специальными маркерами, по крайней мере, до части «значение», после чего все идет Тогда, возможно, шаблон работает примерно так:
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
для генерации окончательного шаблона регулярного выражения; он используется для улучшения читабельности общей картины "картины"
Два подхода; первый - если ваше свойство состоит из трех элементов, просто замените первый (\S*) на:
(\S+?)\.\S+?\.(\S+)
Обратите внимание, я также заменил * на +, так как не имеет смысла иметь "..." как часть свойства, я также использовал не жадные классификаторы, но это все равно должно работать нормально без них. Затем вы можете просто использовать соответствующие номера групп для восстановления скорректированного свойства. Второй подход, предполагающий, что ваша случайная строка является шестнадцатеричным числом (что, похоже, так и есть), а неслучайные части свойства не содержат чисел:
((?:\S+.)*)(?:[0-9A-Fa-f]+.)?((?:\S+.?)+)
Итак, первая группа должна подобрать все до случайного числа (включая точку в конце строки), вторая группа съест случайное число, а третья будет подбирать оставшуюся строку (или всю, если нет части случайного числа).
EDIT
С обновленным описанием проблемы и совпадением только двух групп мой ответ - это невозможно. В регулярном выражении нет механизма "стирания" части совпадения. Из определения проблемы следует, что часть ключа, которая не должна быть включена, находится в середине другого текста, т.е. общий шаблон для соответствия таков:
((a)(?:b)(c))
Поскольку мы не можем предварительной или последующей обработки, "b" всегда будет частью большей группы соответствия, включающей a и c, тот факт, что это не совпадающая группа, не влияет на большую группу.