Метод Javascript для разделения строки на запятой без кавычек - PullRequest
2 голосов
/ 08 марта 2012

Вы могли бы подумать, что об этом уже спрашивали, но я не могу его найти.

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

Я пробовал два подхода, но не прибил его.

Мне нужно включить это:

'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'

в это:

[
 'body.loaded"who, are , you" div"hello ,"#div-id span CODE',
 'body.loaded span"span, text" code'
]

1) -> сопоставить хорошие части, что в основном работает, но дает мне много пустых строк в моем результате.

'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'.match(
  /([^,]*"[^"]*")*/g
)

['body.loaded"who, are , you" div"hello' ,'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' body.loaded span"span, text"', '', '', '', '', '', '']

Я думаю, что этоиз-за () в регулярном выражении.

2) разделить плохие части, которые еще не совсем там.Идея здесь состоит в том, чтобы сопоставлять запятые, за которыми следует четное число ".

'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'.split(
    /,(?![^"]*"[^"]*("[^"]*"[^"]*)*$)/
);

По сути, должно быть более простое и красивое решение (имейте в виду, что JavaScript не поддерживает взгляды сзади).1021 *

1 Ответ

12 голосов
/ 08 марта 2012

Если вы не поддерживаете escape-символы в строках, заключенных в двойные кавычки, это, вероятно, должно работать:

/(?:"[^"]*"|[^,])+/g

Если вы хотите поддерживать обратную косую черту внутри строк в двойных кавычках, это должно сделать следующее:

/(?:"(?:\\.|[^"])*"|[^,])+/g

Если вы хотите поддерживать обратную косую черту за пределами строк в двойных кавычках (например, экранирование начальной кавычки), попробуйте следующее:

/(?:"(?:\\.|[^"])*"|\\.|[^,])+/g

Вот объяснение того, как работает третий шаблон.

Во-первых, расширенная аннотированная версия:

(?:      # start a non-capturing group
  "      # Match a double quote
  (?:    # Another non-capturing group, for the contents of the double-quote
    \\.  # Match any backslash-escaped character
  | [^"] # or any non-double-quote character
  )*     # End the group. Repeat zero or more times
  "      # Close double quote
|        # Alternative to double-quoted string
  \\.    # Match any escaped character
|        # Another alternative
  [^,]   # Match any non-comma character
)+       # Close group, repeat one or more times

Здесь есть три основных компонента.

Первый - сопоставить любую строку в двойных кавычках. Это в первую очередь в группе, потому что если здесь может совпадать строка в двойных кавычках, она должна, в отличие от использования правила без запятых. Внутри этой строки в двойных кавычках мы можем сопоставить любой экранированный символ (\\.), что позволяет нам избегать двойных кавычек внутри строки, или мы сопоставляем любой символ без двойных кавычек. Мы сопоставляем только один символ за раз, чтобы не перехватывать escape-символы с помощью правила символа без двойных кавычек. Содержимое строки использует *, поскольку строки в двойных кавычках могут быть пустыми, и тогда мы завершаем строку.

Вместо строки в двойных кавычках мы можем просто сопоставить любой экранированный символ (\\.). Это позволяет нам избежать символа двойной кавычки, находясь вне строки в двойных кавычках. Это на самом деле позволяет нам избежать запятой тоже, что я не уверен, если вы хотите. Если вы не хотите, это правило должно превратиться в \\[^,].

И, наконец, если мы не можем сопоставить здесь строку в двойных кавычках, и мы не можем сопоставить escape, просто сопоставим любой символ без запятой. Это не повторяется, чтобы не отлавливать более поздние двойные кавычки или экранировать это правило.

Затем мы продолжим и повторим весь шаблон с модификатором +. Это позволяет нам сопоставлять более одного токена одновременно. Мы используем + вместо *, чтобы избежать возврата пустых строк в нашем результате.

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