Совпадение между кавычками, кроме запятых

1

У меня есть это регулярное выражение: (?<=")(?:\\.|[^"\\])*(?=")

Он соответствует каждому символу внутри кавычек и исключает сами кавычки.

Когда я попробую это с такой строкой:

"one","two","three"

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

one
,
two
,
three

Есть ли способ изменить регулярное выражение, чтобы исключить эти запятые? То есть, так что выход:

one
two
three

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

Вот мое большое регулярное выражение:

((0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.\d\d\d\d)|(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0-9])|"((?:\\.|[^"\\])*)"

Первая часть соответствует дате: dd.mm.yyyy

((0 [1-9] | [12] [0-9] | 3 [01]) (0 [1-9]. |. 1 [012])\д\д\д\д)

Вторая часть соответствует времени: hh: mm: ss

(([0-1] [0-9]) | ([2] [0-3])): ([0-5] [0-9]): ([0-5] [0-9] )

И последний должен соответствовать всем символам между кавычками:

"((?:.\| [^" \]) *)"

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

Вход представляет собой текстовый файл со строками:

"AK Pz 310u PI-13-5","23.02.2015","07:45:00","23.02.2015","09:20:00","False","True","23.02.2015","07:40:00","2","Common","AK Pz 310u PI-13-5","Common"

Ожидаемый результат - это массив значений в кавычках (конечно, без запятых и кавычек). Причина, по которой я использую такие большие регулярные выражения для совпадения дат и времени, заключается в том, что их нельзя сопоставлять, если они ошибаются.

Теги:
match

3 ответа

3
Лучший ответ

Чтобы ваше регулярное выражение не совпало с запятыми, вам нужно удалить поисковые запросы и использовать группы захвата для извлечения содержимого между двойными кавычками. Потому что образы - это утверждения, которые не будут соответствовать ни одному символу. Так что в этом "one","two","three" вход на первый ваш регулярное выражение соответствует one, то он соответствует следующее ,, так как запятая также присутствует в двойных кавычках.

"((?:\\.|[^"\\])*)"

Это регулярное выражение заставляет сопоставлять каждый блок строки с двойными кавычками.

Java-код был бы,

String value = "\"one\",\"two\",\"three\"";
Matcher m = Pattern.compile("\"((?:\\\\.|[^\"\\\\])*)\"").matcher(value);
while(m.find())
{
    System.out.println(m.group(1));
}

Вывод:

one
two
three

DEMO

  • 0
    Этот, кажется, работает лучше, чем у меня, выглядит хорошо! Я даже не знал, что вы можете ссылаться прямо с сайта, если честно.
  • 0
    Но что, если предоставленное вами регулярное выражение является частью другого большого регулярного выражения? Будет ли это работать?
Показать ещё 10 комментариев
0

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

(?<=")([a-zA-Z0-9]*)*(?=")

Обычно я использую сайт, например https://regex101.com/, для проверки моих регулярных выражений. Очень легко понять, почему все согласовано! Причина, по которой вы соответствовали вашим запятым, заключалась в том, что это были технически все еще символы между апострофами.

  • 1
    Это не соответствует буквенно-цифровым символам. Это соответствует заглавным или строчным буквам. Буквенно [a-zA-Z0-9] диапазону нужен диапазон, например [a-zA-Z0-9] или [a-zA-Z\d]
  • 0
    Глупый я, забыл добавить эту часть. Спасибо!
0

Почему бы не попробовать это?

"(.*?)"

для строк "один", "два", "три", "четыре": матчи будут:

one
two
three
four

См. Здесь: Regex101

Надеюсь, поможет.

  • 0
    это не будет иметь дело с избежавшими кавычками.
  • 0
    Да, группа захвата просто хранит вещи в запятых

Ещё вопросы

Сообщество Overcoder
Наверх
Меню