Строка Java, разделенная точкой с запятой, исключая точки с запятой, помещенные в кавычки [дубликат]

Вы можете попробовать что-то вроде этого:

let test = true;
$('#css_toggle').click(function() {
  if(test) {
    $('link.sty').attr("href","style.css");
    test = false;
  } else {
    $('link.sty').attr("href","style1.css");
    test = true;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link class="sty" href="style.css" rel="stylesheet">

<button id="css_toggle" title="I'm a tooltip!">Text</button>
<div class="sq"></div>

0
задан GameBuilder 14 May 2013 в 19:44
поделиться

4 ответа

Попробуйте это:

String source = "Alpha,Beta,Gama,\"23-5-2013,TOM\",TOTO,\"Julie, KameL\n"
              + "Titi\",God,\" timmy, tomy,tony,\n"
              + "tini\".";

Pattern p = Pattern.compile("(([^\"][^,]*)|\"([^\"]*)\"),?");
Matcher m = p.matcher(source);

while(m.find())
{
    if(m.group(2) != null)
        System.out.println( m.group(2).replace("\n", "") );
    else if(m.group(3) != null)
        System.out.println( m.group(3).replace("\n", "") );
}

Если он соответствует строке без кавычек, результат возвращается в группе 2. Строки с кавычками возвращаются в группе 3. Следовательно, мне нужно было провести различие в while- блок. Вы можете найти более красивый способ.

Выход: Alpha Beta Gama 23-5-2013, TOM TOTO Julie, KameLTiti God timmy, tomy, tony, tini.

1
ответ дан 1000ml 4 September 2018 в 07:09
поделиться

Анализ CSV намного сложнее, чем можно было бы представить с первого взгляда, поэтому ваш лучший вариант - использовать хорошо разработанную и протестированную библиотеку для выполнения этой работы для вас. Две библиотеки: opencsv и supercsv и многие другие. Посмотрите на оба и используйте тот, который наилучшим образом соответствует вашим требованиям и стилю.

5
ответ дан fvu 4 September 2018 в 07:09
поделиться

См. этот связанный ответ для достойного Java-совместимого регулярного выражения для синтаксического анализа CSV.

Он распознает:

  • Новые строки (после значений или внутри кавычек)
  • Цитированные значения, содержащие экранированные двойные кавычки, такие как ""this""

Короче говоря, вы будете использовать этот шаблон: (?:,|\n|^)("(?:(?:"")*[^"]*)*"|[^",\n]*|(?:\n|$))

Затем собирайте каждый Matcher group(1) в цикле find().


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

0
ответ дан Patrick Parker 4 September 2018 в 07:09
поделиться

Описание

Рассмотрим следующий пример универсального регулярного выражения , проверенный на Java-парсере , который не требует дополнительной обработки для повторной сборки частей данных. Первая соответствующая группа будет соответствовать котировке, а затем переносит это до конца матча, чтобы вы были уверены, что захватили все значение между, но не включая кавычки. Я также не записываю запятые, если они не были встроены подстрокой с разделителями с разделителями.

(?:^|,\s{0,})(["]?)\s{0,}((?:.|\n|\r)*?)\1(?=[,]\s{0,}|$)

Пример

$Matches = @()
$String = 'Alpha,Beta,Gama,"23-5-2013,TOM",TOTO,"Julie, KameL\n
Titi",God,"timmy, \n
tomy,tony,tini"'
$Regex = '(?:^|,\s{0,})(["]?)\s{0,}((?:.|\n|\r)*?)\1(?=[,]\s{0,}|$)'

Write-Host start with 
write-host $String
Write-Host
Write-Host found
([regex]"(?i)(?m)$Regex").matches($String) | foreach {
    write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'`t= value at $($_.Groups[2].Index) = '$($_.Groups[2].Value)'"
    } # next match

Выход

start with
Alpha,Beta,Gama,"23-5-2013,TOM",TOTO,"Julie, KameL\n
Titi",God,"timmy, \n
tomy,tony,tini"

found
key at 0 = ''   = value at 0 = 'Alpha'
key at 6 = ''   = value at 6 = 'Beta'
key at 11 = ''  = value at 11 = 'Gama'
key at 16 = '"' = value at 17 = '23-5-2013,TOM'
key at 32 = ''  = value at 32 = 'TOTO'
key at 37 = '"' = value at 38 = 'Julie, KameL\n
Titi'
key at 60 = ''  = value at 60 = 'God'
key at 64 = '"' = value at 65 = 'timmy, \n
tomy,tony,tini'

Сводка

enter image description here [/g5]

  • (?: start non capture group
  • ^ требует начала строки
  • | или
  • ,\s{0,} запятая, за которой следует любое количество пробелов
  • ), закрывает группу не захвата
  • ( группа начала записи 1
  • ["]? потребляет цитату, если она существует, мне нравится делать это таким образом, чтобы вы хотели включить другие символы, а затем цитату
  • ) закрыть группу захвата 1
  • \s{0,} потребляют любые пробелы, если они существуют, это означает, что вам не нужно обрезать значение позже
  • ( начало группы захвата 2
  • (?:.|\n|\r)*? захватить все символы, включая новую line, non greedy
  • ) закрыть группу захвата 2
  • \1, если бы была цитата, она была сохранена в группе 1, поэтому, если бы это было тогда,
  • (?= начать нулевое утверждение вперед
  • [,]\s{0,} должно иметь запятую, а затем необязательные пробелы
  • [f 19] или
  • $ конец строки
  • ) закрывает нулевое утверждение вперед
3
ответ дан Ro Yo Mi 4 September 2018 в 07:09
поделиться
Другие вопросы по тегам:

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