正则表达式 - 终止字符出现在字符串中

Regular Expression - Terminating character appears in string

我带着另一个正则表达式问题回来了。我已经尝试了一些东西,但我似乎无法用我拥有的一些消息传递数据来解决这个不幸的问题。我需要解析 swift 消息的特定值,这在我 99% 的情况下都有效,但有时有人在我关心的字段中输入了终止符。

假设我有这样的文本字符串

some noise :50F: some noise 3/GB some noise :50A: 

我的表达式是在字段 :50F: 中查找 3/ 之后的 2 个字符,编码如下;

50F:[^:]*?3\/([A-Z]{2})

我使用 [^:] 因为我只关心 50F 字段中的那些值,例如,如果我有这样的字符串;

some noise :50F: some noise some noise :50A: 3/GB 

我不想匹配 GB

这非常有效 - 除了在极少数情况下我的字符串本身包含一个 : 在字段结束之前(似乎对此没有限制)例如;

some noise :50F: some : noise 3/GB some noise :50A: 

显然 returns 什么都没有 - 它只是在那里真正搜索“一些”。

问题是 :50A: 跟在这个字段后面是不必要的,它可以是多个字段中的任何一个(我什至不确定列表)但每个字段都是 :[0-9]{ 2,3}[A-Z]{0,1}:- 是否有办法在达到某种模式时停止对值的搜索?而不是我目前使用的冒号?

我怀疑解决方案是某种消极的前瞻性 - 到目前为止我还没有设法让任何东西发挥作用

您可以使用

50F:(?:(?!:[0-9]{2,3}[A-Z]?:).)*?3\/([A-Z]{2})

参见regex demo

详情:

  • 50F: - 文字字符串
  • (?:(?!:[0-9]{2,3}[A-Z]?:).)*? - 任何单个字符(换行字符除外),零次或多次出现但尽可能少,不会启动以下模式:: + 两个或三个数字 + 一个可选的 ASCII 大写字母和一个 : 字符(有关详细信息,请参阅
  • 3\/ - 文字 3/ 字符串
  • ([A-Z]{2}) - 第 1 组:两个大写字母。