gpt4 book ai didi

正则表达式匹配不被另一个字符包围的值?

转载 作者:行者123 更新时间:2023-12-04 09:44:47 24 4
gpt4 key购买 nike

这是我尝试过的最艰难的事情之一。多年以来,我一直在搜索,但我一直找不到解决方法-匹配一个不包含给定字符的字符串,例如引号或大于/小于符号的字符串。

这样的正则表达式可以匹配不在HTML链接中的URL,不在引号中的SQL table.column值以及许多其他内容。

Example with quotes: 
Match [THIS] and "something with [NOT THIS] followed by" or even [THIS].

Example with <,>, & "
Match [URL] and <a href="[NOT URL]">or [NOT URL]</a>

Example with single quotes:
WHERE [THIS] LIKE '%[NOT THIS]'

基本上,当字符串(THIS)不在给定字符的包围下,如何匹配?
\b(?:[^"'])([^"']+)(?:[^"'])\b

这是一个测试模式:像我想的那样的正则表达式只能匹配第一个“引号”。

To quote, "quote me not lest I quote you!"

最佳答案

最好的解决方案将取决于您对输入的了解。例如,如果您要查找未用双引号引起来的内容,这是否意味着双引号将始终保持适当的平衡?是否可以通过反斜杠或将其用单引号引起来转义?

假设最简单的情况-不嵌套,不转义-您可以使用如下所示的前瞻:

preg_match('/THIS(?=(?:(?:[^"]*+"){2})*+[^"]*+\z)/')

找到目标(THIS)之后,先行基本上会计算该点之后的双引号,直到字符串的结尾。如果它们的数量为奇数,则匹配必须发生在一对双引号内,因此无效(超前失败)。

正如您所发现的,此问题不适用于正则表达式。这就是为什么所有建议的解决方案都依赖于真正的正则表达式中找不到的功能,例如捕获组,环顾四周,勉强和所有格的量词。如果没有 possessive quantifiersatomic groups,我什至不会尝试。

编辑:要扩展此解决方案以解决可以用反斜杠转义的双引号,您只需要替换正则表达式中与“任何不是双引号”匹配的部分:
[^"]

与“任何不是引号,反斜杠或反斜杠后跟任何内容的内容”:
(?:[^"\\]|\\.)

由于反斜杠转义序列相对较少,因此值得在正则表达式的该部分匹配尽可能多的未转义字符:
(?:[^"\\]++|\\.)

放在一起,正则表达式变为:
'/THIS\d+(?=(?:(?:(?:[^"\\]++|\\.)*+"){2})*+(?:[^"\\]++|\\.)*+$)/'

应用于您的测试字符串:
'Match THIS1 and "NOT THIS2" but THIS3 and "NOT "THIS4" or NOT THIS5" ' +
'but \"THIS6\" is good and \\\\"NOT THIS7\\\\".'

...应匹配 'THIS1''THIS3''THIS4''THIS6'

关于正则表达式匹配不被另一个字符包围的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com