如何使用正则表达式来指定逻辑上这个或这个或这个或这个的一系列模式?

时间:2014-01-10 17:20:38

标签: regex sed

可以编写正则表达式模式[gH8/]+来指定g,或H或8或斜杠中的一个或多个。

可以写[{d0,d1,d2,a0,a1,a2,sp}]+来指定一个或多个单词d0d1d2a0,{{1} },a1a2

我想编写一个包含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

是否可以将模式组合成一种模式?将模式组合成一种模式是否值得将表现结合起来,还是仅仅是一种学术练习呢?

3 个答案:

答案 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}[^_]+_/

示例:http://regex101.com/r/gT1cM3

答案 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+?匹配下划线后跟一个或多个字母数字字符,并从您显示的内容中找到所需的全部内容。你甚至可以只用_ ..

逃脱