如何在字符串中返回第 n 个正则表达式匹配?

Posted

技术标签:

【中文标题】如何在字符串中返回第 n 个正则表达式匹配?【英文标题】:How can I return the nth regex match in a string? 【发布时间】:2019-05-31 20:16:10 【问题描述】:

在 PL/SQL 中工作。

我有以下字符串

('Jade Court','Sarah M.', 4, '08/17/2017')

我需要编写一个正则表达式来解析' 字符之间的每个项目。例如,我需要Jade CourtSarah M.08/17/2017 等。

到目前为止,我想出了以下正则表达式:

(?<=')[^']+(?=')

正如您从下面的演示中看到的那样,到目前为止,这是通过同时找到每个必要的项目来实现的。

https://regex101.com/r/CV8evw/1

但是,我需要能够单独解析它们。有没有办法在我的正则表达式中添加一个量词,以便我可以指定我想要的匹配项?

我尝试了(?&lt;=')[^']+(?=')1,我希望它会返回Jade Court,但不幸的是,它不起作用。这可能吗?

【问题讨论】:

尝试REGEXP_SUBSTR( col, '''([^'']+)''', 1, 1, NULL, 1),然后提取第二个REGEXP_SUBSTR( col, '''([^'']+)''', 1, 2, NULL, 1),以此类推 @WiktorStribiżew,是的,它有效!感谢您的建议!下面的其他答案也非常有帮助。 我发布了answer。 【参考方案1】:

您可以使用REGEXP_SUBSTR function 并利用其nth_appearance 参数。

你可以使用的正则表达式是

'([^']+)'

它匹配',然后将除' 之外的任何1+ 个字符捕获到组1 中,然后匹配'。可以通过设置为1sub_expression 参数访问组1 值。见regex graph:

因此,要获得第一个匹配项,您需要使用

REGEXP_SUBSTR(col, '''([^'']+)''', 1, 1, NULL, 1)

要提取第二个,请使用

REGEXP_SUBSTR(col, '''([^'']+)''', 1, 2, NULL, 1)

等等。

【讨论】:

【参考方案2】:

你可以试试这个正则表达式:

/\w2,\/?\s?\w*(\/\d4)?/g

使用javascript进行视觉测试

const x = "('Jade Court','Sarah M.', 4, '08/17/2017')"

const regex = /\w2,\/?\s?\w*(\/\d4)?/g

console.log(x.match(regex))

【讨论】:

以上是关于如何在字符串中返回第 n 个正则表达式匹配?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配第N处

如何修改一个正则表达式的匹配方式

如何使用 Perl 中的正则表达式匹配字符串中第 n 个索引处的字符/字母/符号/数字

Oracle 正则表达式函数-REGEXP_INSTR 使用例子

正则表达式如何匹配多行的所有任意字符

正则如何匹配某字符之后的内容