正则表达式检测不在{}之间的所有内容然后从匹配的搜索中搜索

Sha*_*ark 7 php regex

我对stackoverflow和Regex都很新,所以请原谅我的错误.

我一直在寻找一个正则表达式来匹配所有不在花括号{}之间的文本,并从该文本中找到某些单词.例如,从以下字符串:

$content = 'Hello world, { this } is a string with { curly brackets } and this is for testing'

我想搜索单词this只返回第二次出现,this因为它在不在花括号内的区域.即使我可以使用正则表达式匹配大括号外的子串,我也会简化一些事情.我发现这个正则表达式,/(}([^}]*){)/但它不能选择部分Hello world,, and this is for testing因为它们不在里面}{,它只选择is a string with部分.

另外我想问一下是否可以将两个正则表达式组合起来用于像我这样的单一目的.例如,第一个Regex在外部查找字符串{},第二个查找搜索的特定单词.

我想在php中使用这个正则表达式,现在我使用的函数更像是一个黑客.目的是找到不在的特定单词,{}可靠地替换它们并写入文本文件.

在此先感谢您的帮助.

zx8*_*x81 6

(*SKIP)(*F)

你很幸运,因为php的PCRE正则表达式引擎有一种非常适合这种任务的语法.这个整洁的正则表达式就像一个魅力(见演示):

{[^{}]*}(*SKIP)(*F)|\bthis\b
Run Code Online (Sandbox Code Playgroud)

好的,但它是如何工作的?

很高兴你问.交替的左侧 |匹配完成{braces}然后故意失败,之后引擎跳到字符串中的下一个位置.右侧与this您想要的单词匹配,我们知道它们是正确的,因为它们与左侧的表达不匹配...

如何在PHP中使用它

就像通常的那样:

$regex = "~{[^{}]*}(*SKIP)(*F)|\bthis\b~";
$count = preg_match_all($regex,$string,$matches);
Run Code Online (Sandbox Code Playgroud)

你想看看 $matches[0]

进一步阅读有关此类和类似的排除技术

这种情况非常类似于关于"正则表达式匹配模式,除非......"的问题,如果您感兴趣并享受(*SKIP)权力,您可能希望阅读以完全理解该技术以及如何扩展它.