2015-07-18 5 views
2

Я отделяю строка "foo, bar, c; qual =" baz, blurb ", d; junk =" quux, syzygy "" запятыми, но хочу сохранить запятые в кавычках. На этот вопрос был дан ответ в этом Java: splitting a comma-separated string but ignoring commas in quotes вопрос, но он не работает чтобы полностью объяснить, как плакат создал этот кусок кода, который:.

line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1); 

ОК, так что я понимаю, некоторые из того, что происходит, но есть немного, что сбивает с толку меня, я знаю, что первый запятая для согласования .

Затем

 (?= 

- это прямой поиск.

Тогда первая часть группируется

([^\"]*\"[^\"]*\"). 

это, где я запутаться. Поэтому первая часть

[^\"]* 

означает, что начало любой строки с кавычками отдельных токенов ноль или более раз.

Тогда приходит \». Теперь это как открытие цитаты в строке или она говорят сопрягать эту цитату?

Тогда он повторяет ту же самую строку кода, почему?

 ([^\"]*\"[^\"]*\") 

В вторая часть добавляет тот же код еще раз, чтобы объяснить, что он должен закончить с цитатами.

Может кто-то объяснить часть я не получаю?

+1

'^'внутри квадрата скобки означают не '' '' '' '' '' ', но обратная косая черта существует как escape-символ. Поэтому' [^ \ "] *' соответствует любой строке, которая не содержит '' '. –

+0

Спасибо, это помогло бы, если бы я знал, что часть. Я все еще не понимаю часть после [^ \ "], хотя – spaga

+0

@ M.Shaw она должна быть' [^ \ "] *' соответствует любому символу, но не '' ', ноль или более раз. –

ответ

3

[^\"] - любая строка без ". \" Матчи ". Таким образом, в основном ([^ \ "] * \" [^ \ "] * \") соответствует строке, которая содержит 2 ", а последний символ - ".

1

Я думаю, что они делают очень хорошую работу, объясняя позже в ответ:

[^\"] является матч, кроме цитаты. \" - это цитата.

Так эта часть ([^\"]*\"[^\"]*\") является

  1. [^\"]* матча, кроме цитаты 0 или более раза
  2. \" матча цитаты, да это открытие цитаты
  3. [^\"]* матча, кроме цитаты 0 или более раза
  4. \" quote quote, закрытие цитаты

Им требуется только первый [^\"]*, потому что они не начинаются с предложения, их пример ввода похож на a="abc",b="d,ef". Если вы разобрали "abc","d,ef", вам это не понадобится.

+0

Да, плакат объясняет, что происходит ну, это не помогло, что я был немного из базы. Я просто не понял синтаксиса – spaga

0

вот ваша строка /, (?= ([^ \ "] \" [^ \ "] \") [^ \ "] $)/

здесь считывание из https://regex101.com/

, matches the character , literally 
(?=([^\"]*\"[^\"]*\")*[^\"]*$) Positive Lookahead - Assert that the regex below can be matched 
1st Capturing group ([^\"]*\"[^\"]*\")* 
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data 
[^\"]* match a single character not present in the list below 
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
\" matches the character " literally 
\" matches the character " literally 
[^\"]* match a single character not present in the list below 
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
\" matches the character " literally 
\" matches the character " literally 
[^\"]* match a single character not present in the list below 
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
\" matches the character " literally 
$ assert position at end of the string 
+0

, это очень полезный инструмент, спасибо – spaga

Смежные вопросы