我如何构造一个正则表达式来查找以字符串结尾但不以字符串开头的所有单词?
e.g。在下面的句子中找到所有以'friend'结尾但不以'girl'开头的单词:
<男朋友和女朋友在他们要求成为他们
时获得朋友粗体中的项目应匹配。 '女朋友'这个词不应该。
答案 0 :(得分:21)
在我的头顶,你可以尝试:
\b # word boundary - matches start of word
(?!girl) # negative lookahead for literal 'girl'
\w* # zero or more letters, numbers, or underscores
friend # literal 'friend'
\b # word boundary - matches end of word
<强>更新强>
这是另一种非显而易见的方法,它应该适用于正则表达式的任何现代实现:
假设您希望提取出现在多个上下文中的模式,但只想在特定上下文中出现匹配,您可以在首先指定不需要的内容时使用更改,然后捕获您执行的操作
因此,使用您的示例,提取除friend
之外的girlfriend
中的所有单词或结尾单词,您将使用:
\b # word boundary
(?: # start of non-capture group
girlfriend # literal (note 1)
| # alternation
( # start of capture group #1 (note 2)
\w* # zero or more word chars [a-zA-Z_]
friend # literal
) # end of capture group #1
) # end of non-capture group
\b
注意:
可以描述为:
在Javascript中:
const target = 'A boyfriend and girlfriend gained a friend when they asked to befriend them';
const pattern = /\b(?:girlfriend|(\w*friend))\b/g;
let result = [];
let arr;
while((arr=pattern.exec(target)) !== null){
if(arr[1]) {
result.push(arr[1]);
}
}
console.log(result);
,在运行时,将打印:
[ 'boyfriend', 'friend', 'befriend' ]
答案 1 :(得分:6)
试试这个:
/\b(?!girl)\w*friend\b/ig
答案 2 :(得分:5)
这可能有效:
\w*(?<!girl)friend
您也可以尝试
\w*(?<!girl)friend\w*
如果您想匹配befriended
或boyfriends
等字词。
我不确定?<!
是否在所有正则表达式版本中都可用,但这个表达式在Expersso中工作(我相信它是.NET)。
答案 3 :(得分:4)
我改变了Rob Raisch对正则表达式的回答,该正则表达式找到包含特定子字符串的单词,但不包含不同的特定子字符串
\b(?![\w_]*Unwanted[\w_]*)[\w_]*Desired[\w_]*\b
例如\ b(?![\ w _] * mon [\ w _] *)[\ w _] *天 [\ w _] * \ b将在其中找到包含“day”(例如day,tuesday,daywalker)的每个单词,除非它还包含“mon”(例如星期一)
对某人有用。