regex 匹配除给定单词以外的所有文本部分

zazmityj  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(102)

我有一个text,我需要匹配所有的文本部分,除了给定的单词regexp
例如,如果文本是' Something went wrong and I could not do anything ',给定的单词是'and''not',则结果必须是['Something went wrong', 'I could', 'do anything']
请不要建议我使用string.split()string.replace()等。我知道有几种方法可以用内置方法来做到这一点。我想知道是否有一个正则表达式可以做到这一点,当我将执行text.match(/regexp/g)
请注意,正则表达式必须至少在Chrome,Firefox和Safari版本中工作,并且不低于当前版本的3!在问这个问题的时候,实际的版本分别是100.0、98.0.2和15.3。例如,您无法在Safari中使用lookbehind功能
在回答我的问题之前,请到https://regexr.com/检查你的答案!。正则表达式应该突出显示句子的所有部分,包括需要部分的单词之间的空格以及需要部分周围的空格,除了给定的单词
在问这个问题之前,我试着做我自己的搜索,但这个链接没有帮助我。我也试过不接受的答案:
Match everything except for specified strings
Regex: match everything but a specific pattern
Regex to match all words except a given list
Regex to match all words except a given list (2)
Need to find a regular expression for any word except word1 or word2
Matching all words except one
Javascript match eveything except given words

hjzp0vay

hjzp0vay1#

在javascript中只使用match和lookaheads是可能的。

/\b(?=\w)(?!(?:and|not)\b).*?(?=\s+(?:and|not)\b|\s*$)/gi

测试RegExr here
基本上匹配一个不是限制词的词的开头
\b(?=\w)(?!(?:and|not)\b)
然后进行惰性匹配,直到下一个空格和受限制的单词,或者不包括最后一个空格的行尾。
.*?(?=\s+(?:and|not)\b|\s*$)
测试片段:

const re = /\b(?=\w)(?!(?:and|not)\b).*?(?=\s+(?:and|not)\b|\s*$)/gi

let str = `   Something went wrong    and    I could   not   do anything   `;
let arr = str.match(re);
console.log(arr);
af7jpaap

af7jpaap2#

请参见下面的【编辑】。
你可以使用这个正则表达式,它只使用look ahead:

/(?!and|not)\b.*?(?=and|not|$)/g

说明:

(?!and|not)-andnot的负前瞻
\b-匹配字边界,以防止匹配ndot
.*?-匹配任何字符零次或多次,尽可能少
(?=and|not|$)-提前查找andnotend of text
如果文本有多行,则可以添加m标志(多行)。也可以将dot(.)替换为[\s\S]

编辑:

我做了一些修改,删除了禁止使用的单词:

/(?!and|not)\b\w.*?(?= and| not|$)/g

我添加了一个\w字符匹配,以将匹配的开始推到空格之后,并在前瞻中添加了空格。

Edit 2:(用于处理单词周围的多个空格):

你就差一点!您只需要在美元符号和指定的单词之前添加一个\s*即可:

/(?!and|not|\s)\b.*?(?=\s*(and|not|$))/g

更新链接:regexr.com

相关问题