RegExp:如何从字符串中删除前导组和尾随组

时间:2017-02-09 21:57:45

标签: regex

我正在对一个长字符串执行一个正则表达式,捕获它的一部分。 其中一个部分位于引号之间,它可以包含由斜杠分隔的任意数量的子部分,例如:

'george'
'paul/john'
'john/peter/charles'
...

子部分未知,可以按任何顺序排列。

我需要在引号之间检索字符串,但我希望能够在执行时删除不需要的前导和尾随组。

例如,如果字符串以bruce或bongo 开头,我想将其删除

'bruce/peter/marc'      -> peter/marc
'bongo/bob/kevin/chris' -> bob/kevin/chris

但是如果字符串以其他任何东西开头,那么我想保留它

'alfie/george/paul'         -> alfie/george/paul

在该组中,只有一个单词可以出现,在上面的例子中,开头只能出现布鲁斯或邦戈。

为此,我成功使用了以下正则表达式:

/'(?:bruce|bongo|)\/?([^']+)'/

以类似的方式我想删除一个尾随组 如果字符串以sam或mark结尾,请说我也想删除此部分,例如:

'emily/grace/poppy/sam' -> emily/grace/poppy
'connor/barnaby/mark' -> connor/barnaby

同样,最后只有一个单词可以存在,在示例中只有sam或mark可以结束字符串。

我想使用与上面相同的内容并使用类似的内容:

/'(?:bruce|bongo|)\/?([^']+)(?:sam|mark|)'/

但是它不起作用:如果存在则删除布鲁斯或邦戈,而如果存在,则总是保留萨姆或标记。

我知道我可以按原样提取匹配并使用字符串操作方法将其删除。我目前正在使用javascript,我可以使用:

"bruce/john/charles/sam".replace(/^(?:bruce|bongo)\//, '').replace(/\/(?:sam|mark)$/, '');

但我想知道是否有办法直接使用我对长原始字符串执行的初始正则表达式来实现相同的结果。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

您必须在?之后添加+来使中间部分变得懒惰:

'(?:bruce|bongo|)\/?([^']+?)(?:sam|mark|)'

如果您希望捕获组排除/sam之前发生的mark,那么:

'(?:bruce|bongo|)\/?([^']+?)(?:\/sam|\/mark|)'