Ruby 正则表达式:排除撇号,但如果它被转义,则包括它



我正在尝试编写一个 ruby 正则表达式,以便从长字符串(HTML 源代码)中提取一些数据。

从下面的字符串中,我想保留四个数字(1,11,30,90)和第一个单引号字符串(blablabla)

AjouterRDV(1, 11, 30, 90, 'blablabla', '123' ... (it goes on) );

我的正则表达式目前适用于上述示例,但是当字符串包含转义撇号时失败,例如

AjouterRDV(1, 11, 30, 90, 'it's failing!', '123' ... (it goes on) );

这是我的正则表达式,其中包含两个示例字符串(一个通过,另一个失败)- Rubular

一种更简单的方法(假设您不需要匹配捕获后的任何内容):

AjouterRDV((d+),(d+),(d+),(d+),'(.+?)',

参见 Rubular 示例

你可以试试这个: -

/AjouterRDV( (d+), (d+), (d+), (d+), '((?:(?<=\)[']|[^'])*)', .* );$/ix

'((?:(?<=\)[']|[^'])*)'匹配'前面有 ,或匹配除 ' 之外的任何字符

,只是有人评论,但似乎他删除了它。他的建议是

AjouterRDV( (d+), (d+), (d+), (d+), '((?<=\)[']|[^'])*', .* );$

这几乎有效,除了它没有正确捕获第 5 组的事实。为此,您需要:

AjouterRDV( (d+), (d+), (d+), (d+), '((?:(?<=\)[']|[^'])*)', .* );$

这会将其"外部"组转换为非捕获组,然后在单引号内捕获选择。