RegEx, чтобы соответствовать шаблону и исключить часть строки - PullRequest
1 голос
/ 17 июня 2010

У меня есть несколько строк для сравнения через RegEx.У нас есть Java-приложение, которое считывает регулярное выражение из файла конфигурации и принимает две группы строк, число которых указано в одной и той же конфигурации.

Например,

CustomAction.523274ca945f.dialogLabel=Executing Custom Code...

будет сопоставлено с

(?m)^(?!#)\s*(\S*)\s*=\s*(\S*.*)

Мне нужно выбрать первую группу "CustomAction.523274ca945f.dialogLabel" и исключить случайную строку в середине, чтобы я в итоге получил что-то вроде "CustomAction.dialogLabel" или "CustomAction..dialogLabel".любая другая комбинация, кроме случайной строки.

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

pattern: (?m)^(?!#)\\s*([^.=\\s]*)\\.(?:[^.=\\s]*\\.)?([^.=\\s]*)\\s*=\\s*(.*?)\\s*$
key_group:  1
value_group:    2

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

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

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

два подхода; вначале при условии, что ваша собственность состоит из трех предметов, простая замена вашей первой (\ S *) на:

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

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

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

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

EDIT

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

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

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

0 голосов
/ 17 июня 2010

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

  • # в начале строки - это комментарий
  • "ключ "может иметь до 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 для генерации окончательного шаблона регулярного выражения;он используется для улучшения читабельности общей картины "шаблон"

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