【问题标题】:Regular Expression for data packets from websockets来自 websocket 的数据包的正则表达式
【发布时间】:2021-08-02 09:58:14
【问题描述】:

我的应用程序从 websocket 接收数据包。数据有一些格式可以提供有关数据的信息,示例如下。

  • 握手 [0,"957529506107a4c7b3dba869424463",1,"Ratchet/0.3.6"]
  • 事件 [8,"316662",{"id":1115411,"side":"left"}]

我想要正则表达式来识别数据包的类型和不同段的值。 尝试了很多正则表达式,但都不满意。

更新: 我尝试使用以下 .net 代码,但它给出了错误

Regex.IsMatch("[0,\"957529506107a4c7b3dba869424463\",1,\"Ratchet\\/ 0.3.6\"]", "/\\s*\\[(\\d+),\"([^\"]+)\", (\\d +),\"(.*?)\"\\]$");

【问题讨论】:

  • 您目前尝试了什么?而我们通常会得到什么类型的数据结构呢?还有其他格式吗?我们需要有关您从网络套接字接收的数据的更多信息。
  • 我尝试创建不同的正则表达式但没有运气,将它们丢弃。这些是解决我的工作的两种结构:) 其他我不需要的结构。对于握手消息,结构是第一个元素是 int,第二个元素是字符串,第三个元素是数字,第四个是字符串。同样对于 Event 我们有数字、字符串、json
  • 下面我的回答对你有帮助吗?
  • 好的,谢谢。只有握手和事件标题是错误的,但这是我的错误。实际的数据包是带有大括号和文本的数据。我刚刚在我的问题中添加了握手和事件的标题以进行区分。无论如何,我从正则表达式中删除了标题并且很好,再次感谢:)

标签: regex csv


【解决方案1】:

我们可以做一个单一的正则表达式来匹配它们,但由于结构不同,我建议你为每种情况使用一个正则表达式,这样你就可以知道你匹配的是哪一个。

为了握手

我会使用这个正则表达式(带有不区分大小写的标志):

/^handshake\s*\[(\d+),"([^"]+)",(\d+),"(.*?)"\]$/i

你可以在这里测试它:https://regex101.com/r/u17G7y/1

解释:

  • ^handshake\s* 仅在以 handshake 和一些可选空格开头时匹配。

  • \[ 匹配左括号。

  • (\d+) 匹配数字并捕获它。

  • "([^"]+)" 将匹配并捕获包含除引号之外的任何字符的字符串。

  • "(.*?)" 有点相似,但方法不同。它通过以不贪婪的方式匹配任何字符来捕获引号之间的字符串。这是因为我不知道字符串本身是否可能包含转义引号,例如"Some \"quotes\" in the string"

  • \]$ 匹配服装括号和字符串的结尾。

对于事件

我会使用这个正则表达式(带有不区分大小写的标志):

/^event\s*\[(\d+),"([^"]+)",(\{.*\})\]$/i

你可以在这里测试:https://regex101.com/r/mZ6V5D/1

唯一的区别是我们要捕获 3 个元素而不是 4 个 我们必须以贪婪的方式在{} 字符之间捕获,因为我们不知道该对象是否包含其他对象。这就是我使用(\{.*\}) 而不是(\{.*?\}) 的原因。

如果你只能有一个正则表达式

在这种情况下,您可以将两个正则表达式与 (?:AAA|BBB) 语法放在一起,其中 AAAHandshake 模式,BBBEvent 模式。这导致了这个正则表达式:

/^(?:handshake\s*\[(\d+),"([^"]+)",(\d+),"(.*?)"|event\s*\[(\d+),"([^"]+)",(\{.*\}))\]$/i

你可以在这里测试:https://regex101.com/r/srzJw7/1

【讨论】:

  • 您的解决方案在您提供的链接中有效,但是当我使用以下源代码在 .net 中运行它时,它返回错误 Regex.IsMatch("[0,\"957529506107a4c7b3dba869424463\",1,\"Ratchet \\/ 0.3.6\"]", "/\\s*\[(\\d+),\"([^\"]+)\", (\\d +),\"(.* ?)\"\]$")
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多