Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 一个用于word和非wor字符的正则表达式_Regex - Fatal编程技术网

Regex 一个用于word和非wor字符的正则表达式

Regex 一个用于word和非wor字符的正则表达式,regex,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***RL*CITGO*JJ*20090518*1036*25110*X*00405\n

我有一个这样的消息负载

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


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

使用前瞻来断言您的搜索词位于
\n
字符之前:

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

以下内容将与
GS
#
匹配。我跳过了
#
,因为我不确定您的请求使用的是哪种语言或应用程序。每个程序和编程语言都有一个稍微不同的REGEX实现,具有不同的标志和跨新行的匹配

PHP(PCRE)风格:

典型的正则表达式
语句

(GS|\#)

如果您的语言支持通过字符串进行无任务搜索(它可能支持,这是如何操作的,例如
sed
grep
),只需使用与此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 

例如:

@snipes83与
/GS |#/
不一样吗?@millimoose与
/GS |#/
不一样吗?@snipes83是错误的。您的RE将匹配所有内容,包括上次出现的
GS
#
:(然后再次说明,这意味着我错了,他们是一样的。)@snipes83又错了:-
/foo | bar
似乎等同于
/(foo)|(bar)/
。(我不确定为什么
fooar
foobar
测试用例在看起来应该失败的时候没有失败,但RE肯定没有按照您认为的方式解释。)regex的哪种风格?“查找”此事件后,您希望匹配和/或捕获什么?您能否在示例中突出显示您希望匹配的事件?在标准正则表达式中,
不是“特殊的”;
\(
\)
是。此外,在斜杠中围绕RE也不是PCRE风格——斜杠不是RE的一部分,它们是Perl、Ruby和Javascript中regexp文本周围的分隔符。(事实上,Perl和Ruby可能允许使用几种类型的分隔符。)您将它们放在PHP的模式中,因为PHP没有一流的regexp文本,但仍然希望有它们。@millimoose我经常使用
字符作为分隔符,我很清楚。根据他们使用的应用程序的不同,我提供了带有分隔符的答案,因此如果OP将答案放入类似
preg_replace()
的内容中,他们不会得到错误
PCRE
PHP
如何引用它们的实现。我已经对大约30种不同的应用程序和10种不同的语言进行了
REGEX
匹配,并且提到了一些实现如何匹配换行符,而另一些则不匹配;不是指斜杠的实施。他们甚至可能正在使用
grep
。PCRE是一个特定的库,在PHP之外是可用的,我可以说它本身并不需要斜杠。这是您的两个示例之间的唯一区别,说它是一个PCRE ism(微妙地)是不准确的。@millimoose使用PHP。我用的是他们的术语。我想说的是,“PCRE库的样式”和“PHP的PCRE扩展使用的样式”(这是相当特殊的)之间有区别。你的措辞模棱两可,我只是想澄清一下,我并不是故意反对你的回答。