这是一些字符串的例子。
<div>other text</div> some text abc , <div>need_match_this</div> bbbb <p>hsa</p> aa <span>hello</span>
我只知道字符串"<span>hello</span>"
的结尾,我需要匹配最近的&#34;上面的文字&#34;格。
我使用了这个正则表达式:
\<div\>(.*?)\<\/div\>.*?\<span\>hello\<\/span\>
但是这对我不起作用,因为我只需要返回最接近div的文本,而不是字符串中的第一个div。
是否有任何正则表达式解决方案可以解决此问题?
请帮忙。
谢谢
答案 0 :(得分:5)
您需要使用基于正面的负面前瞻而不是中间.*?
,因为.*?
也会匹配打开或关闭div
标记。
<div>((?:(?!<\/?div>).)*?)<\/div>(?:(?!<\/?div>).)*?<span>hello<\/span>
(?:(?!<\/?div>).)*?
强制正则表达式引擎匹配任何字符,但不匹配<div>
或</div>
。也就是说,在匹配每个字符之前,此正则表达式将检查该特定字符不是<div>
或</div>
中的起始字符。如果是,那么它将匹配该特定字符。如果不是,匹配将突然失败,并且以下字符不会匹配。
示例:强>
string - <div></div>
正则表达式 - <div>((?:(?!<\/?div>).)*?)<\/div>
对于此输入,上面提到的正则表达式将捕获中间的空字符串(,即开始和结束div
标记之间存在空字符串)。上面的(?!<\/?div>).
将检查以下char不能是<div>
或</div>
中的起始字符,但是这会失败,因为以下字符是<
,这是一个凝视字符在</div>
。因为我们将此特定正则表达式定义为重复零次或多次(?:(?!<\/?div>).)*?
,所以它会捕获中间的空字符串。