可以编写正则表达式模式[gH8/]+
来指定g,或H或8或斜杠中的一个或多个。
可以写[{d0,d1,d2,a0,a1,a2,sp}]+
来指定一个或多个单词d0
,d1
,d2
或a0
,{{1} },a1
和a2
。
我想编写一个包含sp
的一系列模式的模式。
以下是候选字符串。
or'd
我不想捕获包含下划线的其他类型的字符串
0000087C _ActualCoNTRoLCCDREFerenceReaD DS.B 640
00000006 0040 _CoNTRoLCCDHorizontalPIXelsPhysicalRange DC.W $0040
00000010 4F46 4600 _.S6: DC.B 'OFF',0
000006EA 0000 0014 R _NewCoNTRoLCCDSPeed DC.L _.S7_nccdsp
0000000E 0000 0032 R DC.L _ActualCoNTRoLCCDHorizontalPIXels
这是我第一次尝试将这些字符串捕获为'sed -nre'模式。
00000008 0418 DC.W $0418
?v_x_d 267,_CoNTRoLCCDREFerenceReaDAccess,'CoNTRoLCCDREFerenceReaDAccess'
XDEF _ActualCoNTRoLCCDShiftOUT
_ActualCoNTRoLCCDBINning CoNTRoLCCDData:00000064
是否可以将模式组合成一种模式?将模式组合成一种模式是否值得将表现结合起来,还是仅仅是一种学术练习呢?
答案 0 :(得分:1)
不确定这是否是针对您的问题的最佳解决方案,但这会以您最初尝试的方式解决您的问题。 [0-9A-F]{8}
之后的每个组都可以包含在()?
中,以使该部分可选。唯一需要注意的是()
将创建匹配的组(根据您的示例,这应该没问题。)
/[0-9A-F]{8}(\s+[0-9A-F]{4})?(\s+[0-9A-F]{4})?(\s+R+)?(\s+D)?.+_/
现在,如果您只是寻找一个8位十六进制后跟一个包含_
的字符串,您可以将其缩小为更清晰的版本:
/^[0-9A-F]{8}.*_.*$/
请注意,我从头到尾检查了^
和$
,并使用.*_.*
来匹配其中包含_
的整个字符串。如果你不关心匹配整个字符串,那可以更简单:
/[0-9A-F]{8}[^_]+_/
答案 1 :(得分:1)
从语法的角度来看,您可以轻松地将它们组合成一种模式
您在问题中编写正则表达式的方式可以看出,从表达式到表达式,它们在彼此之间构建。例如,您的第一个表达式[0-9A-F]{8}\s+_
存在于所有后续表达式中,依此类推。
了解这一点,您可以通过创建组并附加?
:
/[0-9A-F]{8}\s+([0-9A-F]{4}\s+)?([0-9A-F]{4}\s+R+\s+)?(D.+)?_/p
注意:这是唯一可能的,因为您指定了-r
参数。如果由于某种原因您必须取消此参数,则必须重新构建正则表达式并使用(x|)
而不是x?
。
关于性能,我会说这个正则表达式应该比四个独立的正则表达式快,其中一个是上面的单个表达式。
答案 2 :(得分:0)
为什么不使用_\w+
?匹配下划线后跟一个或多个字母数字字符,并从您显示的内容中找到所需的全部内容。你甚至可以只用_
..