使用正则表达式来解析指定的协议

时间:2014-10-31 11:41:22

标签: java regex

我的服务器收到#1037szdx001A8911*之类的消息,现在我需要szdx001调用sid sid的长度由字符7决定。长度为8或9。 使用String.substring()可以很容易地获得长度。然后我会根据长度得到sid

但是现在我尝试使用正则表达式。这是我的模式。 #(\\d)(\\d{2})(\\d)(\\w{7})(\\w)(\\d{4})*

我的问题是如何在java语法中用以下组替换7。

1 个答案:

答案 0 :(得分:0)

从您提供的正则表达式判断,输入字符串通常会分成这些字段:

# 1 03 7 szdx001 A 8911 *

和第5个字段(szdx ...)是唯一可变的字段?如果这是正确的,那么您不需要知道其大小来将字符串解析为字段:

#(\d)(\d{2})(\d)(\w+)(\w)(\d{4})*

上述正则表达式将前四个字段和最后一个字段解析为固定大小。可变大小的字段将获得第4和第6个字段之间的任何文本。您必须单独检查第五个字段是否正确。 [注意我已经删除了加倍的反斜杠;我们只是谈论正则表达式,而不是在字符串常量中指定反斜杠的正确方法。]

上面稍微限制一点的形式是:

#(\d)(\d{2})(\d)(\w{7,9})(\w)(\d{4})*

这会将第五个字段限制在7到9个字符之间。

如果你必须使用 正则表达式解析字符串,并且你不能分别验证第五个字段的长度,那么你可以这样做:

#(\d)(\d{2})(?:7(\w{7})|8(\w{8})|9(\w{9}))(\w)(\d{4})*

重要的部分是(?:7(\w{7})|8(\w{8})|9(\w{9}))。这是一个包含三种选择的非捕获组:' 7'然后是7个字符的字符串,或者' 8'然后是一个8个字符的字符串,或者	 9'后跟一个9个字符的字符串。请注意,每个捕获组的编号将在此处更改; 7个,8个和9个字符的字符串分别位于不同的捕获组中,因此您的代码必须检查所有三个字符串。