我将构建一个消息传递系统,其消息具有以下结构:
message type;message content
(匹配message type;
)
但是,用户可以设置消息类型,并且(为了松耦合系统)我想允许他们使用;
作为消息类型的一部分。为此,我将使用\
:
tl\;dr;Too long; didn't read content
(匹配tl\;dr;
)
如何将正则表达式匹配所有内容,直到第一个;
不是\;
?在示例中,这只是tl\;dr;
部分。请注意,邮件内容中可以有未转义的;
。
我尝试了^.*;
,但该内容与消息中的分号匹配(例如tl\;dr;Too long;
)
答案 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中,我必须使用:
/^([^;\\\]|\\\.)*?;/
...匹配所有不是\\
或;
的字符,或者如果遇到\\
,也可以在它后面吃掉角色而不管它是什么,直到下一个角色将是;
如果你想匹配所有部分,这将是我使用的:
/([^;\\\]|\\\.)*?(?=;|$)/