我想匹配所有包含cat
或dog
但不包含catdog
的字符串(不是单词)。
基本上是:
的字符串逻辑等效项string s;
(s.contains('cat') || s.contains('dog')) && !s.contains('catdog')
cat
dog
catdog
catsAreSoft
IHavedogs
(cat)|(dog)|^(?!catdog)
cat
dog
catsAreSoft
IHavedogs
答案 0 :(得分:5)
只需使用以下替代方法进行搜索:
\b(?:cat|dog)\b
这将与文字cat
或dog
匹配,但只能作为独立单词。
答案 1 :(得分:2)
只需使用单词边界 \b
匹配在后面跟一个单词字符但不匹配的位置 前面有文字字符,或前面有文字字符 但后面没有文字字符。
\bcat\b|\bdog\b
答案 2 :(得分:2)
所有答案都集中在单词“ cat”和“ dog”上。
问题是
包含“猫”或“狗”
的所有字符串
所以我认为解决方案应该是:
$ perl -ne 'print if /cat(?!dog)|(?<!cat)dog/' << HERE
> cat
> dog
> catdog
> hasdogcat
> hascatdog
> has just cat dog
> HERE
cat
dog
hasdogcat
has just cat dog
答案 3 :(得分:1)
仅在字符串cat
或dog
或space
的包围下匹配字符串end
或start
您可以使用
(?<=\s|^)(?:cat|dog)(?=\s|$)
(?<=\s|^)
-匹配项之前必须是space
或start of string
(?:cat|dog)
-匹配cat
或dog
(?=\s|$)
-匹配项后必须紧跟space
或end of string
P.S。 :- 这将处理诸如cat'dog
或cat-dog
之类的字符串,而使用\b
不会
答案 4 :(得分:1)
您的原始表达似乎很好,我们在这里只使用单词边界:
(\bcat\b|\bdog\b)
,如果我们希望找到包含猫和狗的字符串,则可以将其扩展为:
(?=.*\bcat\b|.*\bdog\b).*
jex.im可视化正则表达式:
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(\bcat\b|\bdog\b)";
string input = @"cat
dog
catdog";
RegexOptions options = RegexOptions.Multiline;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?=.*\bcat\b|.*\bdog\b).*";
string input = @"cat
dog
catdog
Anything we wish before cat then anything we wish afterwards
Anything we wish before dog then anything we wish afterwards
Anything we wish before catdog then anything we wish afterwards";
RegexOptions options = RegexOptions.Multiline;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}
答案 5 :(得分:1)
您可以尝试使用以下表达式:(?(?=cat)(?!catdog)cat)|(?(?=dog)(?<!cat)dog)
逻辑说明:
(?(?=cat)(?!catdog)cat)
-断言后面是cat
,但如果是,则断言后面不是catdog
,如果是,则匹配cat
< / p>
(?(?=dog)(?<!cat)dog)
-断言后面是dog
,如果是,则断言前面是NOT cat
,如果是,则匹配dog
整个表达只是两者之间的交替。
它允许您匹配任何cat
和dog
,如果它们不是catdgog
的一部分。