正则表达式捕获多个重复模式模式

Posted

技术标签:

【中文标题】正则表达式捕获多个重复模式模式【英文标题】:Regex Capture mutiple repeating pattern Pattern 【发布时间】:2022-01-23 19:50:20 【问题描述】:

我有一个关于使用正则表达式解析多个重复组的问题。 用户可能会输入一些查询,我需要从中解析并构造正确的 sql 语句。 有人可能会进入:

Artist:Rolling Stones
Artist:"Rolling Stones"
Artist:"Rolling Stones" AND Title:Satisfaction
Artist:"Rolling Stones" AND Title:Satisfaction AND FileType:mp3

此正则表达式将解析前 2 个样本:

(([A-Za-z].+?):("?.+"?)\s(AND|and|Or|or)?)

但我可以有 1,2 或 n 个同组。有什么东西,我可以说重复多次并使用相同的模式来匹配示例 3 中的标题以及示例 4 中的标题和文件类型。

我想出了这个:

(([A-Za-z].+?):("?.+"?)\s(AND|and|Or|or)?)\s+?(([A-Za-z].+?):("?.+"?)(AND|and|Or|or)?)?

这将捕获样本 3,但在 1 和 2 上不匹配。

感谢任何帮助。谢谢

【问题讨论】:

工具或语言是什么?这个Artist:Rolling StonesArtist:"Rolling Stones" 可以出现在双引号之间,也可以不出现?如果 OR 或 AND 是标题的一部分怎么办? 在我看来,正则表达式并不是最好的工具。我建议使用antler 之类的东西来为您的查询定义语法并将它们进一步转换为 SQL 感谢您的所有回答。会试试看..我使用的语言是c#。最终可能会进行一些字符串操作,例如拆分、索引、子字符串,然后在这些操作上使用正则表达式以进一步解析 【参考方案1】:

我不知道正则表达式是否是这项工作的最佳工具,但我想出了

(\w+?\:\"?.+?\"?(?=(\sAND|\sOR|$)))

您可以看到它与您的令牌匹配, 说明:它使用正向前瞻来确保每个标记在 AND OR 或行终止之后都有,所以你的第一个和第三个匹配

在您的第一组中,您将找到您的查询,在第二组中,您将找到 AND 和 OR

Demo

说明:使用先行查找单词 AND 或 OR 来分隔标记,同时考虑行尾以匹配单个标记

【讨论】:

感谢丹尼尔的回答。这很有帮助。唯一的问题是,如果我在艺术家或标题中有 AND 或 OR,但我可以处理。然后需要像 "\AND" 等转义。

以上是关于正则表达式捕获多个重复模式模式的主要内容,如果未能解决你的问题,请参考以下文章

.Net 正则表达式用捕获组替换重复出现的模式

如何使用正则表达式在 url 中捕获 ec2 弹性 ip 模式 [重复]

为啥这个正则表达式模式不能按预期工作?

java 匹配正则表达式并捕获命名模式

捕获包含模式正则表达式的每个单词

C# - 正则表达式匹配模式、替换和捕获行号 [来自 Txt 文件]