0

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

message type;message content

(匹配message type;

但是,用户可以设置消息类型,并且(为了松散耦合的系统)我希望允许他们使用 a;作为消息类型的一部分。为此,我将使用消息构造函数将其转义\

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

(匹配tl\;dr;

我怎样才能让正则表达式匹配所有内容,直到第一个;不是\;在示例中,这tl\;dr;只是一部分。请注意,;消息内容中可能存在未转义。

我试过^.*;了,但是这匹配了消息中所有内容到分号(例如tl\;dr;Too long;

4

3 回答 3

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

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

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

/^.*?[^\\](?=;)/
于 2013-05-15T01:09:30.277 回答
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'
于 2013-05-15T01:18:55.570 回答
0
/^([^;\]|\.)*?;/

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

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

... 不匹配所有字符\\or ;,或者如果你遇到 a \\,也吃掉它之后的字符,不管它是什么,直到下一个字符是;

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

/([^;\\\]|\\\.)*?(?=;|$)/
于 2013-05-15T01:09:44.967 回答