Какое регулярное выражение будет соответствовать каждому символу, кроме запятой ',' или точки с запятой ';'?

345

Можно ли определить регулярное выражение, которое будет соответствовать каждому символу, кроме определенного определенного символа или набора символов?

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

Кшитий Саксена -KJ-
источник

Ответы:

474
[^,;]+         

Вы не указали реализацию регулярного выражения, которую используете. У большинства из них есть Splitметод, который берет разделители и разделяет их. Возможно, вы захотите использовать его с «нормальным» (без ^) классом символов:

[,;]+
Мехрдад Афшари
источник
10
И вопрос не определяет, разрешены ли соседние разделители, поэтому конечный знак «+» немного сомнителен.
Джонатан Леффлер
Получение ошибки только для semicolon-- несогласованного регулярного выражения встречается конец файла
Jaswinder
У меня было такое же требование, когда я хочу избежать точки с запятой и запятой в конце, я много пробовал, но ниже не получается, что Regex я использую const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9]) \) + [A-Za-z0-9] [A-Za-z0-9 -]?. { 0,61} [A-Za-z0-9] / г; Ну, это подтверждает, если я использую, и; между, но не в конце, чтобы vliadate.
Гарри
87

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

[^,;]
Том смит
источник
У меня было такое же требование, когда я хочу избежать точки с запятой и запятой в конце, я много пробовал, но ниже не получается, что Regex я использую const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9]) \) + [A-Za-z0-9] [A-Za-z0-9 -]?. { 0,61} [A-Za-z0-9] / г; Ну, это подтверждает, если я использую, и; между, но не в конце, чтобы vliadate.
Гарри
2

Использовать это:

([^,;]*[,;])*
NawaMan
источник
5
Для этого требуется запятая или точка с запятой в качестве разделителя полей, а не в качестве разделителя полей. Разница имеет значение в конце «строки» (или другой структуры отсканированной записи); как правило, вы не хотите настаивать на запятой или точке с запятой после последнего поля. Если ваш движок регулярных выражений достаточно мощный, вы можете использовать ' (?:([^,;]*)(?:[^,;]|$))' (PCRE с не захватывающими скобками). Альтернативы запятой или точки с запятой после поля или конца записи, заставляют вещи работать лучше. Также подумайте, разрешены ли пустые поля.
Джонатан Леффлер
1
Наконец, вам нужно беспокоиться о том, что на самом деле возвращают записи - действительно ли вы хотите, чтобы разделители были включены, и если в строке 10 полей, сколько из них будет возвращено в записи записи.
Джонатан Леффлер
1
Вы правы во всем этом, но причина, по которой я не согласился с этим в своем ответе, заключается в том, что я не знаю, на каком языке / в библиотеке RegEx спрашивает спрашивающий. Он может использовать «GREP». В любом случае, я ценю, что вы добавили эти комментарии, чтобы прояснить для него вещи. : D
NawaMan