2013-05-15 3 views
0

Я собираюсь построить систему передачи сообщений, сообщения имеют следующую структуру:Могу ли я сделать регулярное выражение для соответствия всем символам; Кроме ;?

message type;message content 

(соответствует message type;)

Однако пользователь может установить тип сообщения, и (для ради слабосвязанных систем) Я хочу разрешить им использовать ; как часть типа сообщения. Чтобы сделать это, я буду иметь конструктор сообщение денешься с \:

tl\;dr;Too long; didn't read content 

(соответствует tl\;dr;)

Как я могу иметь матч регулярок все содержимое до первого ;, что не \; ? В примере, это только часть tl\;dr;. Обратите внимание, что в содержимом сообщения может быть необесцененный ;.

Я попытался ^.*;, но это соответствует все содержимое до точки с запятой в сообщении (например tl\;dr;Too long;)

+0

, что вкус регулярных выражений? (И, скорее всего, это можно решить либо с помощью lookahead, либо позади) – FDinoff

+0

Что-то я могу использовать в Java, Objective C, C#, JavaScript и PHP. – Supuhstar

ответ

3
/.*?[^\\](?=;)/ 

Вы также можете просто использовать ; вместо (?=;), но последний мешает ему быть частью полный матч.

Если вы хотите, чтобы соответствовать с начала строки, используйте:

/^.*?[^\\](?=;)/ 
+0

Это соответствует как 'tl \; dr', так и'; Too long'. – Supuhstar

+1

@Supuhstar вам нужно только использовать первый матч; вы также можете использовать '^' для привязки начала строки –

0
/^([^;\]|\.)*?;/ 

В зависимости от реализации может потребоваться, чтобы избежать \ один или два раза. Например, в PHP я должен был бы использовать:

/^([^;\\\]|\\\.)*?;/ 

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

Если вы хотите, чтобы соответствовать всем частям, это было бы то, что я хотел бы использовать:

/([^;\\\]|\\\.)*?(?=;|$)/ 
+0

Это не подтверждает меня – Supuhstar

+0

Ну, те последние 2 делают для меня в PHP. YMMV. – Wrikken

1

Не знаю, какой язык ар е вы ищете, но вот питон версия регулярное выражение:

^(\\.|[^;])*(?=;) 

На практике:

In [28]: re.search(r'^(\\.|[^;])*(?=;)', r'message type;message content').group(0) 
Out[28]: 'message type' 

In [37]: re.search(r'^(\\.|[^;])*(?=;)', r"tl\;dr;Too long; didn't read content").group(0) 
Out[37]: 'tl\\;dr' 
Смежные вопросы