Выражение регулярного выражения, разрешающее запятую только внутри строки (в кавычках), а не за ее пределами

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

Мой ввод похож на

"1,212121,121212","Extra_data" 

Здесь выражение регулярного выражения не должно проверять наличие запятой в первом значении в кавычках "1,212121,121212", но должно проверяться после кавычек, включая ,"Extra_data". В кратком выражении запятая в строке должна быть разрешена только внутри кавычек, а не снаружи.

Помогите, пожалуйста, с выражением.


person Vignesh Jei    schedule 23.02.2016    source источник
comment
Попытка понять больше; это означает, что "1,212121,121212","Extra_data" является недопустимой строкой? Кроме того, может ли допустимая строка содержать только запятую и ничего больше?   -  person Pramod Karandikar    schedule 23.02.2016
comment
Привет Pramod, выражение должно сделать его недействительным. Да, это может быть только запятая и ничего больше   -  person Vignesh Jei    schedule 23.02.2016


Ответы (4)


Я думаю, это то, что вы ищете, по сути, группа чисел или запятых, заключенных в круглые скобки, за которыми следует запятая и еще одна фраза (не обязательно числа) в круглых скобках. Группа захвата № 1 дает вам «1,212121,121212», а группа захвата № 2 дает вам «Extra_data».

("[\d,]+")(,"[^"]+")

Было бы полезно узнать больше о том, как может поступать ваш ввод. Я думаю, что самый большой вопрос, который остается, заключается в том, всегда ли эта первая группа содержит только цифры/запятые или иногда в ней есть другие символы, такие как буквы, символы подчеркивания и т. д. первая группа? Если эта первая группа содержит только числа, как я предполагал, то это должно работать. Если это не так, то это не сработает.

Редактировать:

"\s*(,\s*"[^"]+")
person Jon    schedule 23.02.2016
comment
Это то, что вы искали? - person Jon; 24.02.2016
comment
Привет Джон, Спасибо за выражение. Как вы сказали, группа 1 - это не обязательно числа, и это может быть любая строка с запятыми между ними. - person Vignesh Jei; 25.02.2016
comment
@VigneshJei: я обновил выражение, основываясь на том, что вы сказали, и на основании того, что, как я думаю, вам нужно. Я на правильном пути с этим? - person Jon; 25.02.2016
comment
Позвольте мне сделать это простым, Джон. Мы не хотим, чтобы проверялась группа 1, и выражение должно проверяться только с запятой после группы 1. - person Vignesh Jei; 25.02.2016
comment
@VigneshJei: Просто добавил еще одно регулярное выражение, чтобы попробовать. Это работает? Если нет, то почему? - person Jon; 25.02.2016
comment
@VigneshJei: или "(?:^|"\s*)(,\s*"[^"]+") допускает возможность открытия строки запятой. Это выражение и последнее предполагают несколько вещей. 1. Что ни одна из цитируемых групп никогда не содержит только запятую, и 2. Что группа справа от внешней запятой всегда заключена в кавычки. - person Jon; 25.02.2016
comment
Спасибо, Джон... Приведенный выше вариант работает \s*(,\s*[^]+) - person Vignesh Jei; 26.02.2016
comment
@VigneshJei: Отлично. Обратите внимание, что \s*(,\s*"[^"]+") предполагает несколько вещей. Предполагается, что входная строка никогда не начинается внешней запятой, что группы в кавычках никогда не содержат только запятую и что группа в кавычках после внешней запятой всегда имеет пару кавычек и никогда не бывает пустой. Если что-то из этого не соответствует действительности, потребуются некоторые корректировки. - person Jon; 26.02.2016

попробуй это

".*?(?=,).*?"

он только извлекает запятую в строке только внутри кавычек

person zhanzezhu    schedule 23.02.2016
comment
ввод:1,212121,121212,Extra_data ; 1,212121,121212,Дополнительно,вывод данных:1,212121,121212,Дополнительно,данные ? - person zhanzezhu; 23.02.2016
comment
Ввод: 1,212121,121212,Extra_data Вывод должен разрешать только 1,212121,121212 и выдавать ошибку ограничения как, Extra_data - person Vignesh Jei; 23.02.2016

Попробуйте следующее регулярное выражение:

"[^"]*"(,)[^"]*"[^"]*"

Он захватит запятые, которые вам нужны. Но обратите внимание, что PHP не поддерживает захват одних и тех же групп. то есть в вашем случае: если ввод: «1,212121,121212», «Extra_data», «hel, lo», «a, bc», он будет захватывать запятые перед «Extra_data» и «a, bc», но будет исключать запятая перед "hel, lo". Для этого вам придется использовать рекурсию.

person Ashish Choudhary    schedule 23.02.2016

Вы можете попробовать использовать это регулярное выражение.

(^,)|("\s*,\s*")|(,$)

Если вы найдете какое-либо совпадение для этого регулярного выражения, строка будет недействительной.

person Pramod Karandikar    schedule 23.02.2016