简而言之:我试图找出某个字符串是否存在于两个字符串/组之间。
背景:我正在将 Confluence 数据中心迁移到云端。将来不支持某些宏或宏组合在彼此内部。我想事先找到有问题的页面。
我可以使用 Regex 和 Rumpelcoder 的“搜索和替换”插件以页面存储格式搜索整个数据库。(他们的正则表达式功能的文档。)我不打算自动替换,但现在只是找到页面。大多数问题组合只会出现在 20000 个页面中的 0-50 个,其中许多情况需要人脑在 Wiki 页面而不是存储语法中修复它们。因此,Regex 的开头和结尾可能很粗略,即是否包含流行语或任何内容。而且我不需要可以重新排列和再次保存的保存位。
菜鸟的解决方案可能性想法:
a)通过lookbehind和lookahead?也可能是负面的。
b)只有三个组,就像我一样。有一个正确的中间组。
c) 计算第 2 和第 3 个搜索组的括号 {}。然后检查 2 是否在 3 之前(然后跳过)或 3 在 2 之前(然后匹配)。听起来最有价值。:-)
d) 在已定义的匹配项中查找字符串的操作。
e) 计算第 2 组在 1 和 3 之间出现的次数。如果出现次数为零,则很好,它可以搜索下一个第 1 组。或其他一些聪明的结构。:-) 任何可行的解决方案都将受到高度欢迎。谢谢。如果我还没有在 stackoverflow 中找到合适的答案,我很抱歉。也许也因为有很多可能性和我不知道放弃无意义的尝试并选择有效的尝试。
Confluence 的存储格式看起来有点像 HTML,带有一些 <...> 和 </...> 可以用作搜索词。
我想出的最好的方法是尝试 b) 类型的 3 组:
/(<ac:structured-macro)(.*?"toc".*?)(<\/ac:structured-macro>)/gm
应该搜索多行。
使用 g 搜索页面上的所有结果。对于此处的示例很方便,但在实际搜索中并不是必需的,因为页面上已经有 1 个匹配项将在人脑工作中结束。如果没有“g”,在所有点击次数 >1 的页面上应该会快一个因子。
当出现“<ac:structured-macro”时开始任何匹配搜索。
而当“toc”出现时,它将在下一个“</ac:structured-macro>”出现时结束。
显然这与最初的问题不同:它肯定在下一个“</ac:structured-macro>”结束。如果第一组和最后一组之间存在“目录”,则匹配。如果它们之间没有“toc”,则不匹配。
因为如果“toc”出现在上述第一个“</ac:structured-macro>”之后,上述搜索只会继续到任何段落中的任何随机下一个“</ac:structured-macro>”。
这里有一些用于搜索的文本示例。可以将整个块粘贴到搜索框中。
- 这里不应该匹配。(但仍然使用原始语法错误地这样做。)
<ac:structured-macro text。没有危险的结构或内容,因此没有来自 Regex 的流行语。以: </ac:structured-macro> 更多文本结尾。不应该在这里比赛!后来某处超出了危险区域,因此是无害的流行语:ac:name="toc" 文本。文件中某处任何内容的随机结尾:</ac:structured-macro>。 - 应该在这里匹配:
<ac:structured-macro text。带有语法流行词 ac:name="toc" 的危险宏更多文本。外部宏结束:</ac:structured-macro>。 - 应该匹配多行:
<ac:structured-macro text。任何数量的换行符。
危险宏:ac:name="toc" 更多文本。
或任何完全空的行。
宏结束:</ac:structured-macro>。
4. 此处不应匹配:
<ac:structured-macro text。没有什么危险的。宏结束:</ac:structured-macro>。