2014-10-31 30 views
-1

我的服務器收到一個消息像#1037szdx001A8911*,現在我需要szdx001稱爲sidsid長度由字符7決定。長度將是8或9。 使用String.substring()可以很容易地獲得長度。然後我會根據長度獲得sid使用正則表達式來prase指定的協議

但現在我嘗試使用正則表達式。這裏是我的模式。 #(\\d)(\\d{2})(\\d)(\\w{7})(\\w)(\\d{4})*

我的問題是,我可以用java語法中的下列組代替7。

+0

「sid的長度是由字符7決定的」是什麼意思?你的'szdx001'字符串長度爲7個字符,但是你聲明它是'8'或'9'。雖然,你的輸入中的「角色7」在哪裏?它是索引4處的字符嗎?很不清楚...... – Mena 2014-10-31 14:57:06

+0

我很抱歉,我沒有說清楚,字符7在索引4處。索引4中的字符可能是8或9.然後我得到協議的子字符串,其中子字符串的長度是索引4的值。 – jackson 2014-10-31 15:13:56

+0

沒有關於爲什麼只用'7'來解釋字符串長度(而不是'37'或'1037')的信息,我們不能給你任何合理的答案,解析字符串。 – nhahtdh 2014-10-31 17:33:13

回答

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個字符的字符串分別位於不同的捕獲組中,因此您的代碼必須檢查所有三個字符串。

相關問題