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

时间:2014-10-03 00:03:59

标签: regex

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

以下是规则。

  1. 数据以字符串形式出现。
  2. ' ='人物有特殊的意义。要逃避=数据可能包含==就像""用带引号的字符串。
  3. if' ='后跟一个介于2-5之间的数字,表示后面的数据是针对该频道的(2,或3或4或5)
  4. 实施例

    1. sdfasjfasdjfalksjdfaksjdflkajsdlfjasdf //假定为"当前频道的数据
    2. = 2sjfksdjfaksjdfkasjdfk //无论以下= 2是针对第2频道
    3. = 2sjdfaksdjf = 3sjfkasjdfk //无论后面是什么= 2是针对频道2而后面的内容是针对频道3
    4. fsdfasjfhajsd = 2sfdjashdfjashfa = 5sfajsdfaksjdf //初始部分用于当前频道, 无论后面是什么= 2是针对频道2,无论后面是什么= 5是针对频道5
    5. 请注意,==已转义,应视为转化=,作为数据的一部分
    6. = 2 = x4 //请注意= x4用于通道2.这意味着如果=后跟一个数字2-5 这意味着有一个频道切换。否则它只是数据的一部分
    7. 这里唯一的特殊情况是字符串的结尾,其中字符串以=结尾。 在这种情况下,我们将不知道将来会发生什么,所以我们必须保持 以后使用含义将其添加到传入缓冲区,以防万一

1 个答案:

答案 0 :(得分:0)

您可以使用

/(?:=(?P<channel>[2-5])|^)(?P<data>(?:(?===)==|(?!=(?:[2-5]|\Z)).)*)/ms

您将在群组channel(如果有)中找到该频道,其余的则在群组data中找到。

Demo.

说明:

(?: # 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
    )*
)