正则表达式:我需要提取除字符串 `ignore` 之外的所有单词
Regex : I need to extract all words except the string `ignore`
以此为例
hello-world
ignore-good-morning-ignore
good-night-ignore
我尝试过负面展望和负面展望
^(?<!ignore)\S+(?!ignore)$
不过好像3个字都挑了
预期结果
hello-world
good-morning
good-night
实际结果
hello-world
ignore-good-morning-ignore
good-night-ignore
我建议交换逻辑并实际匹配您想要忽略的词并替换那些值,从而将字符串保留在预期输出中。例如:
(?<=\S)-ignore\b|\bignore-(?=\S)
在线查看demo。当我们将匹配的子字符串替换为空时,您可以在屏幕底部看到结果。
(?<=\S)
- 断言位置前面有一个非空白字符的积极回顾。
-ignore\b
- 匹配“-ignore”后跟单词边界。
|
- 或者:
\bignore-
- 匹配后跟 'ignore-'. 的单词边界
(?=\S)
- 断言位置的正先行后跟一个非空白字符。
请注意,如果您的字符串也可以只是 'ignore' 而没有其他任何内容,您也可以添加到交替中以捕获它。
如果你想捕获不同数量的多次出现,试试这个没有开始 ^
和结束 $
字符串标记的版本(这样我们就可以捕获所有内容):
(?!\bignore\b)\b(\w+)\b
其中:
(?!\bignore\b)
- 否定前瞻断言我们将捕获的字符串不完全是单词“ignore”。
\b
- 确保我们要捕获的单词是整个单词,而不是部分单词,例如“忽略”
(\w+)
- 抓字
\b
- 如上所述,确保我们能捕获整个单词
如果您使用 C#,您可以拆分字符串并跳过 ignore
个条目:
var words = new[]
{
"hello-world",
"ignore-good-morning-ignore",
"good-night-ignore",
"good-ignore-night",
};
foreach (var word in words)
{
var word2 = string.Join("-", word.Split("-").Where(w => w != "ignore"));
Console.WriteLine(word2);
}
/*
Output:
hello-world
good-morning
good-night
good-night
*/
使用正则表达式,只有一种方法可以匹配除 a
之外的所有内容
某个字符串。
当然,拆分单词或短语以创建句段列表是完成此任务的必经之路,
将特定段与文本字符串匹配可能会有好处。
重要的是你不需要做很多字符串长度就可以得到一个匹配位置
算术,如果你要使用像拆分这样的东西。
对于正则表达式,唯一的方法是使用可以“跳过”单词或短语的引擎。
唯一可以做到这一点的 class 引擎是 Perl、PCRE 或 Python“regex”。
事实上,他们发明了一种可以在匹配后跳过单词或短语的结构。
这是 (*SKIP) 结构。
初步检查包含跳过,因为这是使用
的示例
PCRE,我只是将一些代码重新用作函数调用 "(?1)" 来检查
遍历流时前面没有字。
如果您不能使用 Perl / PCRE 风格的引擎,您最好使用
你最喜欢的分割函数。
((?:-|\b)ignore(?:-|\b))(*SKIP)(?!)|(?:(?!(?1)).)+
https://regex101.com/r/Wy21OZ/1
( # (1 start)
(?: - | \b )
ignore
(?: - | \b )
) # (1 end)
(*SKIP)(?!)
|
(?:
(?! (?1) ) .
)+
以此为例
hello-world
ignore-good-morning-ignore
good-night-ignore
我尝试过负面展望和负面展望
^(?<!ignore)\S+(?!ignore)$
不过好像3个字都挑了
预期结果
hello-world
good-morning
good-night
实际结果
hello-world
ignore-good-morning-ignore
good-night-ignore
我建议交换逻辑并实际匹配您想要忽略的词并替换那些值,从而将字符串保留在预期输出中。例如:
(?<=\S)-ignore\b|\bignore-(?=\S)
在线查看demo。当我们将匹配的子字符串替换为空时,您可以在屏幕底部看到结果。
(?<=\S)
- 断言位置前面有一个非空白字符的积极回顾。-ignore\b
- 匹配“-ignore”后跟单词边界。|
- 或者:\bignore-
- 匹配后跟 'ignore-'. 的单词边界
(?=\S)
- 断言位置的正先行后跟一个非空白字符。
请注意,如果您的字符串也可以只是 'ignore' 而没有其他任何内容,您也可以添加到交替中以捕获它。
如果你想捕获不同数量的多次出现,试试这个没有开始 ^
和结束 $
字符串标记的版本(这样我们就可以捕获所有内容):
(?!\bignore\b)\b(\w+)\b
其中:
(?!\bignore\b)
- 否定前瞻断言我们将捕获的字符串不完全是单词“ignore”。\b
- 确保我们要捕获的单词是整个单词,而不是部分单词,例如“忽略”(\w+)
- 抓字\b
- 如上所述,确保我们能捕获整个单词
如果您使用 C#,您可以拆分字符串并跳过 ignore
个条目:
var words = new[]
{
"hello-world",
"ignore-good-morning-ignore",
"good-night-ignore",
"good-ignore-night",
};
foreach (var word in words)
{
var word2 = string.Join("-", word.Split("-").Where(w => w != "ignore"));
Console.WriteLine(word2);
}
/*
Output:
hello-world
good-morning
good-night
good-night
*/
使用正则表达式,只有一种方法可以匹配除 a
之外的所有内容
某个字符串。
当然,拆分单词或短语以创建句段列表是完成此任务的必经之路,
将特定段与文本字符串匹配可能会有好处。
重要的是你不需要做很多字符串长度就可以得到一个匹配位置
算术,如果你要使用像拆分这样的东西。
对于正则表达式,唯一的方法是使用可以“跳过”单词或短语的引擎。 唯一可以做到这一点的 class 引擎是 Perl、PCRE 或 Python“regex”。
事实上,他们发明了一种可以在匹配后跳过单词或短语的结构。
这是 (*SKIP) 结构。
初步检查包含跳过,因为这是使用
的示例
PCRE,我只是将一些代码重新用作函数调用 "(?1)" 来检查
遍历流时前面没有字。
如果您不能使用 Perl / PCRE 风格的引擎,您最好使用
你最喜欢的分割函数。
((?:-|\b)ignore(?:-|\b))(*SKIP)(?!)|(?:(?!(?1)).)+
https://regex101.com/r/Wy21OZ/1
( # (1 start)
(?: - | \b )
ignore
(?: - | \b )
) # (1 end)
(*SKIP)(?!)
|
(?:
(?! (?1) ) .
)+