一个用于单词和非单词的正则表达式

时间:2013-06-03 20:50:27

标签: regex

所以我有一个像这样的消息有效载荷,

**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#的一次出现(即使搜索字符串也在有效负载内)

我知道我可以使用^来识别字符串的开头,但它似乎不适用于我的两个用例

3 个答案:

答案 0 :(得分:0)

使用前瞻声明您的搜索字词之前 \n字符:

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

答案 1 :(得分:0)

以下内容将与GS#匹配。我已经逃过了#,因为我不确定您使用哪种语言或应用来满足您的要求。每个程序和编程语言都有一个略有不同的REGEX实现,带有不同的标志和新行匹配。

PHP的(PCRE)风格:

/(GS|\#)/

典型正则表达式OR声明

(GS|\#)

答案 2 :(得分: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