正则表达式捕获多个重复模式模式
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 Stones
和Artist:"Rolling Stones"
可以出现在双引号之间,也可以不出现?如果 OR 或 AND 是标题的一部分怎么办?
在我看来,正则表达式并不是最好的工具。我建议使用antler 之类的东西来为您的查询定义语法并将它们进一步转换为 SQL
感谢您的所有回答。会试试看..我使用的语言是c#。最终可能会进行一些字符串操作,例如拆分、索引、子字符串,然后在这些操作上使用正则表达式以进一步解析
【参考方案1】:
我不知道正则表达式是否是这项工作的最佳工具,但我想出了
(\w+?\:\"?.+?\"?(?=(\sAND|\sOR|$)))
您可以看到它与您的令牌匹配, 说明:它使用正向前瞻来确保每个标记在 AND OR 或行终止之后都有,所以你的第一个和第三个匹配
在您的第一组中,您将找到您的查询,在第二组中,您将找到 AND 和 OR
Demo
说明:使用先行查找单词 AND 或 OR 来分隔标记,同时考虑行尾以匹配单个标记
【讨论】:
感谢丹尼尔的回答。这很有帮助。唯一的问题是,如果我在艺术家或标题中有 AND 或 OR,但我可以处理。然后需要像 "\AND" 等转义。以上是关于正则表达式捕获多个重复模式模式的主要内容,如果未能解决你的问题,请参考以下文章