首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建与此特定协议匹配的正则表达式

如何创建与此特定协议匹配的正则表达式
EN

Stack Overflow用户
提问于 2014-10-03 00:03:58
回答 1查看 50关注 0票数 0

我想知道是否有可能创建一个正则表达式来解析我试图解析的特定协议。

这是规矩。

  1. 数据以字符串形式出现。
  2. 字有特殊的含义。要转义=数据可能包含==,就像引用字符串中的"“一样。
  3. 如果'=‘后面跟着一个介于2-5之间的数字,则表示下面的数据是该通道的数据(2,3,4或5)

示例

  1. 假设为“当前通道”的sdfasjfasdjfalksjdfaksjdflkajsdlfjasdf //数据
  2. =2 2sjfksdjfaksjdfkasjdfk//后面的任何内容=2是第2频道的
  3. =2sjdfaksdjf=3sjfkasjdfk //后面的东西=2是第2频道,后面的是第3频道
  4. fsdfasjfhajsd=2sfdjashdfjashfa=5sfajsdfaksjdf //初始部分用于当前信道,后续部分为信道2,后续部分为5
  5. 请注意,==是转义的,应视为转义=,作为数据的一部分。
  6. =2=x4 //注意=x4是用于通道2的,这意味着if =后面跟着一个数字2-5,它意味着有一个通道开关。否则,它只是数据的一部分。
  7. 这里唯一的特例是字符串的末尾,其中字符串以an =结尾。在这种情况下,我们将不知道稍后会从管道中下来的是什么,所以我们只需要保留它供以后使用,这意味着将其添加到传入缓冲区中,以防万一。
EN

回答 1

Stack Overflow用户

发布于 2014-10-03 06:27:12

您可以使用

代码语言:javascript
复制
/(?:=(?P<channel>[2-5])|^)(?P<data>(?:(?===)==|(?!=(?:[2-5]|\Z)).)*)/ms

您将在组channel中找到通道(如果有的话),其余的在组data中。

演示。

解释:

代码语言:javascript
复制
(?: # first, match a "=" channel...
    =
    (?P<channel>
        [2-5]
    )
| #...or assert position at the start of the string
    ^
)
(?P<data> # next, capture the data in a group
    (?: # repeat the following as often as possible:
        (?= # if there's an escaped "=" ("=="), consume it
            ==
        )
        ==
    |
        (?! # otherwise, if...
            =
            (?: #...the next match doesn't start here...
                [2-5]
            | #...and the string doesn't end with "=" here...
                \Z
            )
        )
        . #...consume a single character
    )*
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26171480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档