正则表达式匹配单词但不匹配其他字符串中的单词

时间:2016-08-01 10:35:04

标签: javascript python regex

我有一个像

这样的富文本
Sample text for testing:<a href="http://www.baidu.com" title="leoshi">leoshi</a>leoshi for details balala...
Welcome to RegExr v2.1 by gskinner.com, proudly hosted by Media Temple!

我想要匹配的是单词leoshi,但不在<a>元素内部,所以在此示例中,leoshi中只有leoshi for details.... < / p>

欢迎提出解决方案和解释!

3 个答案:

答案 0 :(得分:1)

旨在处理此类&#34;找到一个单词但不是特定上下文的技巧&#34;案例描述如下:http://www.rexegg.com/regex-best-trick.html

本质上它是:在不受欢迎的上下文中匹配你的单词,或者(使用交替)只在这个单词中匹配,但是在捕获组中。然后分析捕获。

你的案例中的正则表达式是:

<a.*?>.*leoshi.*<\/a>|(leoshi)

演示:https://regex101.com/r/zO0tV2/1

然后你需要检查捕获:

var input = "...";
var pattern = /<a.*?>.*leoshi.*<\/a>|(leoshi)/;
var match = pattern.exec(input);
var inputMatches = match !== null && match[1] !== null;

演示:https://ideone.com/KkAl2I

答案 1 :(得分:0)

我使用积极的lookbehind来开始匹配 AFTER 结束标记</a>。然后,当leoshi用作单独的单词时,将(?<=<\/a>).*?\b(leoshi)与括号匹配。

正则表达式:action

DEMO

答案 2 :(得分:-1)

最好的方法(使用正则表达式)将首先删除所有标记,然后检测剩余字符串中的单词。例如:

var str_without_links = str.replace(/<a\b.*?<\/a>/, '')
str_without_links.match(/leoshi/)

如果您需要保留字符串长度(与原始字符串对应),请考虑使用占位符代替原始标记。

var str_without_links = str.replace(/<a\b.*?<\/a>/, function(s) { return s.replace(/./g, ' ') })