2013-06-03 38 views
-5

所以我消息負載這樣,一個正則表達式的字和非WOR字符

**GS***RL*CITGO*JJ*20090518*1036*25110*X*00405\n 
ST*423*2511*RT**GS***08247 

我也是另一個消息載荷這樣,

**#**UPT  0000SWSAM001203081454NS  /\n 
GS*QM*TRSC*UPDS *20120309*0820*0309***#***004010 

現在上面兩個例子,我想要一個正則表達式,它只會發現GS#(即使搜索字符串也位於有效負載內)的一次出現

我知道我可以使用^識別字符串的開始,但它似乎並沒有對我的兩個用例

+0

@ snipes83是不是一樣'/ GS |#/'? – millimoose

+0

@millimoose也不是'/ GS |#/'與'/ G(S |#)/'相同嗎? – Snps

+0

@ snipes83錯了。您的RE將匹配所有內容,包括'GS'或'#'的**最後**發生:http://ideone.com/rmQhcA(然後,這意味着我錯了他們是相同的。 ) – millimoose

回答

0

使用先行工作斷言,您的搜索字詞在於之前\n字符:

((GS)|#)(?=.*\n) 
0

以下內容將匹配GS#。我已經逃脫了#,因爲我不確定您的請求使用了哪種語言或應用。每個程序和編程語言都有一個略有不同的REGEX實現,它具有不同的標誌並且跨越新行匹配。

PHP的(PCRE)風格:

/(GS|\#)/ 

典型的正則表達式OR聲明

(GS|\#) 
+0

在標準的正則表達式中,'('和')'不是「特殊」,'\('和'\)'是。此外,它不是PCRE風格,以斜線包圍RE - 斜線不是* RE的一部分,它們是分隔符*圍繞Perl,Ruby和Javascript中的regexp文字。 (事實上​​,Perl和Ruby可能允許使用幾種類型的分隔符。)您將它們放入PHP中的模式中,因爲PHP沒有一流的正則表達式文字,但仍然希望擁有它們。 – millimoose

+0

(以'sed'爲例:http://ideone.com/sA0ROc) – millimoose

+0

@millimoose我經常使用'!'字符作爲分隔符,並且很清楚。根據他們正在使用的應用程序,我用分隔符提供了我的答案,所以如果OP將回答放到'preg_replace()'類似的東西中,他們就不會得到錯誤。 'PCRE'是'PHP'如何引用它們的實現。我已經執行了大約30個不同的應用程序和10種不同語言的REGEX匹配,並且指的是一些實現如何匹配換行符,而其他實現則不匹配;不是指斜槓的實施。他們甚至可能使用'grep'。 –

0

如果你的語言支持的未錨定的搜索通過串(它可能做 - 它是如何如sedgrep),只要使用這個Python代碼的等價物即可:

import re 

payload = '''**GS***RL*CITGO*JJ*20090518*1036*25110*X*00405 
ST*423*2511*RT**GS***08247''' 

needle = r'GS|#' 

match = re.search(needle, payload) # search() is unanchored 

# index of the first matched character 
print match.start() #> 2 

# index of the first character after the match 
print match.end() #> 4 

# prints the substring the RE matched 
print payload[match.start(), match.end()] #> GS 

ideone例如:http://ideone.com/USvlTk

相關問題