我的服务器收到#1037szdx001A8911*
之类的消息,现在我需要szdx001
调用sid
sid
的长度由字符7
决定。长度为8或9。
使用String.substring()
可以很容易地获得长度。然后我会根据长度得到sid
。
但是现在我尝试使用正则表达式。这是我的模式。
#(\\d)(\\d{2})(\\d)(\\w{7})(\\w)(\\d{4})*
我的问题是如何在java语法中用以下组替换7。
答案 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个字符的字符串分别位于不同的捕获组中,因此您的代码必须检查所有三个字符串。