У меня есть это регулярное выражение: (?<=")(?:\\.|[^"\\])*(?=")
Он соответствует каждому символу внутри кавычек и исключает сами кавычки.
Когда я попробую это с такой строкой:
"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
Вторая часть соответствует времени: hh: mm: ss
И последний должен соответствовать всем символам между кавычками:
Но последняя часть в регулярном выражении не работает так, что она не исключает кавычки. И более того, по какой-то причине он удаляет все пробелы в строках, которые заключены в кавычки.
"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"
Чтобы ваше регулярное выражение не совпало с запятыми, вам нужно удалить поисковые запросы и использовать группы захвата для извлечения содержимого между двойными кавычками. Потому что образы - это утверждения, которые не будут соответствовать ни одному символу. Так что в этом "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
Я считаю, что вы пытаетесь сопоставить каждую группу буквенно-цифровых символов между кавычками. Если это так, вы можете использовать следующее регулярное выражение:
(?<=")([a-zA-Z0-9]*)*(?=")
Обычно я использую сайт, например https://regex101.com/, для проверки моих регулярных выражений. Очень легко понять, почему все согласовано! Причина, по которой вы соответствовали вашим запятым, заключалась в том, что это были технически все еще символы между апострофами.
[a-zA-Z0-9]
диапазону нужен диапазон, например [a-zA-Z0-9]
или [a-zA-Z\d]
Почему бы не попробовать это?
"(.*?)"
для строк "один", "два", "три", "четыре": матчи будут:
one
two
three
four
См. Здесь: Regex101
Надеюсь, поможет.