我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
当前回答
我想添加另一个例子,如果你试图匹配一个包含X线的整个线,但也不包含Y线。
这个 regex 模式会工作(在 JavaScript 中也工作)
^(?=.*?tasty-treats)((?!chocolate).)*$
(全球,多线旗在例子中)
互动示例: https://regexr.com/53gv4
比赛
(这些 URL 包含“蛋糕治疗”并且不包含“巧克力”)
example.com/tasty-treats/strawberry-ice-cream example.com/甜点/tasty-treats/banana-pudding example.com/tasty-treats-overview
没有匹配
example.com/tasty-treats/chocolate-cake example.com/home-cooking/over-roasted-chicken example.com/tasty-treats/banana-chocolate-fudge example.com/desserts/chocolate/tasty-treats example.com/chocolate/tasty-treats/desserts
其他回答
在我看来,一个更可读的答案:
^(?!.*hede)
基本上,“在线的开始,如果和只有如果它没有“<unk>”在它” - 所以要求几乎直接翻译成 reggex。
当然,有可能有多个失败要求:
^(?!.*(hede|hodo|hada))
详细信息: ^ anchor 确保 regex 引擎不会在行中的每个位置撤回比赛,这将匹配每个行。
接口工具匹配每行一次,在与多线条合作的背景下,您可以使用“m”旗帜:
/^(?!.*hede)/m # JavaScript syntax
或
(?m)^(?!.*hede) # Inline flag
如果你只是用它来捕捉,你可以使用捕捉 -v 以获得所有不包含捕捉的线条。
ETA Oh,重新阅读这个问题,抓 -v 可能是你指的是“工具选项”。
下面的功能将帮助您获得所需的产量
<?PHP
function removePrepositions($text){
$propositions=array('/\bfor\b/i','/\bthe\b/i');
if( count($propositions) > 0 ) {
foreach($propositions as $exceptionPhrase) {
$text = preg_replace($exceptionPhrase, '', trim($text));
}
$retval = trim($text);
}
return $retval;
}
?>
有了负面看法,正常的表达可以匹配一些不包含特定的模式的东西,这是由Bart Kiers回答和解释的。
但是,与Bart Kiers的答案, lookahead 部分将测试 1 到 4 个字符在前面,同时匹配任何一个字符. 我们可以避免这一点,让 lookahead 部分检查整个文本,确保没有“hede”,然后正常部分(*)可以同时吃整个文本。
下面是改进的雷格斯:
/^(?!.*?hede).*$/
请注意,在负面 lookahead 部分的 (*?) lazy 量子是可选的,您可以根据您的数据使用 (*) greedy 量子:如果“hede”是存在的,在文本的初半, lazy 量子可以更快;否则, greedy 量子会更快。
这里是Demo代码。
此外,请查看RegexGen.js,一个JavaScript常规表达式发明器,有助于构建复杂的常规表达式。
var _ = regexGen;
var regex = _(
_.startOfLine(),
_.anything().notContains( // match anything that not contains:
_.anything().lazy(), 'hede' // zero or more chars that followed by 'hede',
// i.e., anything contains 'hede'
),
_.endOfLine()
);
我必须同意其他答案,但是:如果这只是假设问题,那么一个假设不是正确的选择。