具有逻辑与非功能的正则表达式

时间:2019-06-06 05:45:09

标签: c# regex

我想匹配所有包含catdog但不包含catdog的字符串(不是单词)。

基本上是:

的字符串逻辑等效项
string s;
(s.contains('cat') || s.contains('dog')) && !s.contains('catdog')

测试值:

cat
dog
catdog
catsAreSoft
IHavedogs

正则表达式(实际上不起作用):

(cat)|(dog)|^(?!catdog)

匹配值

cat
dog
catsAreSoft
IHavedogs

6 个答案:

答案 0 :(得分:5)

只需使用以下替代方法进行搜索:

\b(?:cat|dog)\b

这将与文字catdog匹配,但只能作为独立单词。

答案 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)

仅在字符串catdogspace的包围下匹配字符串endstart

您可以使用

(?<=\s|^)(?:cat|dog)(?=\s|$)
  • (?<=\s|^)-匹配项之前必须是spacestart of string
  • (?:cat|dog)-匹配catdog
  • (?=\s|$)-匹配项后必须紧跟spaceend of string

P.S。 :- 这将处理诸如cat'dogcat-dog之类的字符串,而使用\b不会

答案 4 :(得分:1)

您的原始表达似乎很好,我们在这里只使用单词边界:

(\bcat\b|\bdog\b)

Demo 1

,如果我们希望找到包含猫和狗的字符串,则可以将其扩展为:

(?=.*\bcat\b|.*\bdog\b).*

Demo 2

RegEx电路

jex.im可视化正则表达式:

enter image description here

测试1

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);
        }
    }
}

测试2

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

整个表达只是两者之间的交替。

它允许您匹配任何catdog,如果它们不是catdgog的一部分。

Demo