Java RegEx для пары ключевых значений в одной или нескольких строках [дубликат]

Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

19
задан Chris Karcher 3 October 2008 в 19:17
поделиться

3 ответа

  • Нет выхода:
    /([^=,]*)=("[^"]*"|[^,"]*)/
    
  • Двойная кавычка для обоих ключей и значений:
    /((?:"[^"]*"|[^=,])*)=((?:"[^"]*"|[^=,])*)/
    
    key=value,"key with "" in it"="value with "" in it",key=value" "with" "spaces
    
  • Сброс строки обратной косой черты:
    /([^=,]*)=("(?:\\.|[^"\\]+)*"|[^,"]*)/
    
    key=value,key="value",key="val\"ue"
    
  • Полное удаление обратной косой черты:
    /((?:\\.|[^=,]+)*)=("(?:\\.|[^"\\]+)*"|(?:\\.|[^,"\\]+)*)/
    
    key=value,key="value",key="val\"ue",ke\,y=val\,ue
    

Редактирование: добавлены альтернативы экранирования.

Edit2: Добавлена ​​другая альтернативная альтернатива.

очистить ключи / значения, удалив любые escape-символы и окружающие кавычки.

35
ответ дан Markus Jarderot 1 September 2018 в 03:00
поделиться
  • 1
    Это работает для моего простого сценария! Хотя, может быть, неплохо было бы поддержать включение цитаты в значение, экранируя ее, либо двойную («quot»), либо обратную косую черту (\ & quot;) – Chris Karcher 3 October 2008 в 19:39
  • 2
    не могли бы вы мне помочь? Мне нужно что-то подобное, но больше похожее на json stackoverflow.com/questions/6099891/… – Val 23 May 2011 в 17:35
  • 3
    что такое regex для key = value & amp; key = значение, где ключ или значение могут быть нулевыми, ключ и значение могут быть любой вещью – virsha 8 April 2017 в 04:19
  • 4
    @virsha Пожалуйста, добавьте новый вопрос , если вы попросите что-то другое. – Markus Jarderot 9 April 2017 в 11:20

Вот как я мог бы это сделать, если вы можете использовать Perl 5.10.

qr/
  (?<key>
    (?:
      [^=,\\]
    |
      (?&escape)
    )++ # Prevent null keys
  )

  \s*+
  =
  \s*+

  (?<value>
    (?"ed)
  |
    (?:
      [^=,\s\\]
    |
      (?&escape)
    )++ # Prevent null value ( use quotes for that )
  )

  (?(DEFINE)
    (?<escape>\\.)
    (?<quoted>
      "
        (?:
          (?&escaped)
        |
          [^"\\]
        )*+
      "
    )
  )
/x

Доступ к элементам можно получить через %+.

perlretut очень помог в создании этого ответа.

0
ответ дан Brad Gilbert 1 September 2018 в 03:00
поделиться

Хороший ответ от MizardX. Незначительные ошибки - это не допускает пробелов вокруг имен и т. Д. (Что может и не иметь значения), и оно собирает кавычки, а также цитированное значение (что также может не иметь значения), и у него нет механизма эвакуации для встраивания двойные кавычки в цитированном значении (что еще раз может не иметь значения).

Как написано, шаблон работает с большинством расширенных систем регулярных выражений. Фиксация обморок, вероятно, потребует спуска, скажем, в Perl. Эта версия использует двойные кавычки для выхода - следовательно, a = «a» «b» генерирует значение поля «a» «b» (что не идеально, но может быть исправлено после этого достаточно легко):

/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/

Кроме того, вам нужно будет использовать $ 2 или $ 3 для сбора значения, тогда как с ответом MizardX вы просто используете $ 2. Таким образом, это не так просто или приятно, но оно охватывает несколько краевых случаев. Если более простой ответ является достаточным, используйте его.

Тестовый скрипт:

#!/bin/perl -w

use strict;
my $qr = qr/\s*([^=,\s]+)\s*=\s*(?:"((?:[^"]|"")*)"|([^,"]*))\s*,?/;

while (<>)
{
    while (m/$qr/)
    {
        print "1= $1, 2 = $2, 3 = $3\n";
        $_ =~ s/$qr//;
    }
}

Эти witters о том, что либо $ 2, либо $ 3 не определены - точно.

2
ответ дан Jonathan Leffler 1 September 2018 в 03:00
поделиться
Другие вопросы по тегам:

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