我可以使正则表达式匹配所有角色吗?除了 \;?

时间:2013-05-15 01:05:58

标签: regex regex-negation message-passing

我将构建一个消息传递系统,其消息具有以下结构:

message type;message content

(匹配message type;

但是,用户可以设置消息类型,并且(为了松耦合系统)我想允许他们使用;作为消息类型的一部分。为此,我将使用\

让消息构造函数对其进行转义
tl\;dr;Too long; didn't read content

(匹配tl\;dr;

如何将正则表达式匹配所有内容,直到第一个;不是\;在示例中,这只是tl\;dr;部分。请注意,邮件内容中可以有未转义的;

我尝试了^.*;,但该内容与消息中的分号匹配(例如tl\;dr;Too long;

3 个答案:

答案 0 :(得分:3)

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

您也可以使用;代替(?=;),但后者会阻止它成为完整匹配的一部分。

如果您只想从字符串的开头匹配,请使用:

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

答案 1 :(得分:1)

不确定您正在寻找哪种语言,但这里是python版本的正则表达式:

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

在实践中:

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'

答案 2 :(得分:0)

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

根据您的实施情况,您可能需要一次或两次转义\。例如在PHP中,我必须使用:

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

...匹配所有不是\\;的字符,或者如果遇到\\,也可以在它后面吃掉角色而不管它是什么,直到下一个角色将是;

如果你想匹配所有部分,这将是我使用的:

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