需要为除 word1 或 word2 之外的任何单词找到正则表达式

Posted

技术标签:

【中文标题】需要为除 word1 或 word2 之外的任何单词找到正则表达式【英文标题】:Need to find a regular expression for any word except word1 or word2 【发布时间】:2021-11-22 02:06:59 【问题描述】:

基本上我需要一个正则表达式,如果字符串是一个单词 (\w+),它将返回 true,除非它是单词 word1 或 word2。

我已经尝试了很多事情,但我认为我什至没有接近。救命!

【问题讨论】:

Regex to match all words except a given list 的可能重复项 【参考方案1】:

匹配由一个或多个字母、数字或下划线组成的任何单词(因为您提到要使用\w+匹配所有单词)除了word1word2你可以使用negative lookahead 和word boundaries \b 的解决方案:

\b(?!(?:word1|word2)\b)\w+

请参阅regex demo。请注意,在 PostgreSQL 正则表达式中,\b 必须替换为 \y

这里有一些快速的代码 sn-ps:

scala - """\b(?!(?:word1|word2)\b)\w+""".r.findAllIn(text).toList(见demo) groovy - text.findAll(/\b(?!(?:word1|word2)\b)\w+/)(见demo) kotlin - Regex("""\b(?!(?:word1|word2)\b)\w+""").findAll(text).mapit.value.toList()(见demo) powershell - select-string -Path $input_path -Pattern '\b(?!(?:word1|word2)\b)\w+' -AllMatches | % $_.Matches | % $_.Value > $output_file c++ - std::regex rx(R"(\b(?!(?:word1|word2)\b)\w+)"); std::string s = "Extract all words but word1 and word2."; std::vector<std::string> results(std::sregex_token_iterator(s.begin(), s.end(), rx), std::sregex_token_iterator());(见demo) vb.net - Dim matches() As String = Regex.Matches(text, "\b(?!(?:word1|word2)\b)\w+").Cast(Of Match)().Select(Function(m) m.Value).ToArray() swift - extension String func matches(regex: String) -> [String] do let regex = try NSRegularExpression(pattern: regex, options: []) let nsString = self as NSString let results = regex.matches(in: self, options: [], range: NSRange(location: 0, length: nsString.length)) return results.map nsString.substring(with: $0.range) catch let error print("invalid regex: \(error.localizedDescription)") return [] print("Extract all words but word1 and word2.".matches(regex: #"\b(?!(?:word1|word2)\b)\w+"#)) javascript - text.match(/\b(?!(?:word1|word2)\b)\w+/g)(见demo) r - regmatches(text, gregexpr("(*UCP)\\b(?!(?:word1|word2)\\b)\\w+", text, perl=TRUE))(见demo)或stringr::str_extract_all(text, "\\b(?!(?:word1|word2)\\b)\\w+")(见demo) ruby - text.scan(/\b(?!(?:word1|word2)\b)\w+/)(见demo) java - Pattern p = Pattern.compile("(?U)\\b(?!(?:word1|word2)\\b)\\w+"); Matcher m = p.matcher(text); List<String> res = new ArrayList<>(); while(m.find()) res.add(m.group()); (见demo) php - if (preg_match_all('~\b(?!(?:word1|word2)\b)\w+~u', $text, $matches)) print_r($matches[0]); (见demo) python - re.findall(r"\b(?!(?:word1|word2)\b)\w+", text)(见demo) c# - Regex.Matches(text, @"\b(?!(?:word1|word2)\b)\w+").Cast<Match>().Select(x=>x.Value)(见demo) grepbash - grep -oP '\b(?!(?:word1|word2)\b)\w+' file (demo) postgresql - REGEXP_MATCHES(col, '\y(?!(?:word1|word2)\y)\w+', 'g') (demo) perl - @list = ($str =~ m/\b(?!(?:word1|word2)\b)(\w+)/g); (demo)

【讨论】:

【参考方案2】:

就是这样:

^(?!word1|word2)\w*

【讨论】:

【参考方案3】:
^(?!(?:word1|word2)$)\w+$

应该做你需要的。

(?!...) 是一个negative lookahead assertion,可确保在当前位置无法匹配包含的表达式。

【讨论】:

太棒了,正是我需要的!【参考方案4】:

为什么要为此使用正则表达式?

伪代码:

return (str != word1 AND str != word2)

【讨论】:

因为我使用的 PHP 框架需要正则表达式来定义 URL。无论如何,我不能使用代码,只能使用正则表达式。

以上是关于需要为除 word1 或 word2 之外的任何单词找到正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

将 Rails 中的 syslogger 设置为除用户之外的其他内容

RegEx表示字符串中的N个空格

碰到的一个简单的算法题,关于两个字符串word1和word2,判断word1能不能只通过删除字符就能够得到word1.

Elasticsearch的布尔搜索模糊查询 - 意外结果 - “Word1”和“Word2”~3

72-编辑距离

最小编辑距离dp