正则表达式,用于检查字符串是否包含一系列字符中的特定值

时间:2015-03-02 19:28:36

标签: c# regex

我需要在+的间隔内验证字符串是否包含single quotes

示例:string str = "'Name + R405'"

但是,这个字符串可能会出现多个具有这些值的范围。

示例:string str = "'Name + R405' + '(Name)'"。在这种情况下,第二个+在我的代码中有一个特定的功能(它没有单引号)。

换句话说,我只需要识别单引号内的+。如果还有其他方法,请为我​​解释。

更新

在单引号内(我需要的文本在哪里)可能包含其他单引号。因此,我不能简单地做检查来观察一对单引号的开头和结尾。

更新2:

我有一个可能有点复杂的问题。我的系统具有接受某些字符串的函数,并且这些字符串根据某个参数进行操作:

  

单引号中的文字不会被更改/操纵;

     

要将一个文本与另一个文本分开,请使用+;

     

我的字符串必须接受任何字符(这是一个问题,我知道)。

例如:"'Name' + On + 'Sector'"。像这样的字符串只有这些方法操纵的部分"On"。但是,我有"'Name + Code' + On + 'Sector'""'Name'+Code '+ On +'Sector'"等字符串。 "Name + Code" / "Name'+Code"不会被操纵。因此,这些方法与此类文本“混淆”,并且使用文本部分内的+single quotes不应更改。但我无法改变方法,必须在调用方法之前在字符串中执行处理。

3 个答案:

答案 0 :(得分:1)

你可以通过迭代字符并跟踪你看过的单引号来做到这一点。

public static bool HasPlusBetweenSingleQuotes(string str)
{
    bool inSingleQuotes = false;
    foreach (char c in str)
    {
        if (c == '\'')
        {
            inSingleQuotes = !inSingleQuotes;
        }
        else if (c == '+' && inSingleQuotes)
        {
            return true;
        }
    }

    return false;
}

如果您需要单引号内的加号的索引,您可以执行以下操作。

public static IEnumerable<int> PlusBetweenSingleQuotesIndexes(string str)
{
    bool inSingleQuotes = false;
    for(int i=0;i<str.Length;i++)
    {
        if (str[i] == '\'')
        {
            inSingleQuotes = !inSingleQuotes;
        }
        else if (str[i] == '+' && inSingleQuotes)
        {
            yield return i;
        }
    }
}

请注意,这些方法不会验证每个开头单引号是否有结束单引号。

修改

如果您有分隔引号,则只需检查前一个字符是否为\之类的分隔符。

public static bool HasPlusBetweenSingleQuotes(string str)
{
    bool inSingleQuotes = false;
    char previous = ' '; // just defaulting to a space.
    foreach (char c in str)
    {
        if (c == '\'' && previous != '\\')
        {
            inSingleQuotes = !inSingleQuotes;
        }
        else if (c == '+' && inSingleQuotes)
        {
            return true;
        }

        previous = c;
    }

    return false;
}

答案 1 :(得分:0)

我不确定这是否可以用正则表达式完成(可能会这样吗?)。如果你在引号之内或之外,用一个字符循环就可以更容易地做到这一点。

bool inBlock = false;    

foreach(var aChar in string mySentence) {
    //Testing with ascii codes &#43; == +, &#39; == '
    inBlock = (aChar == "&#39;") ? !inBlock : inBlock;
    if(inBlock && aChar == "&#43;")
         // do stuff here
}

作为一个注释,代码可能不起作用,我没有测试它。

答案 2 :(得分:0)

为什么不在这里反转逻辑并使用&#34;连接序列&#34;作为模式的结构?这些可以被描述为 + + On + (带有可选空格)的序列,介于单引号(可能是非平衡的)之间字符串。匹配&#34;胶水&#34;由'的lookbehind预览的序列和'的预测,您可以将字符串解析为&#34;单引号字符串&#34;和#34;胶水&#34;令牌:

 var strings = new string[]
            {"'Name'+Code '+ On +'Sector'", 
             "'Name + R405' + '(Name)'",
             "'Name + Code' + On + 'Sector'",
             "'Name''+'Sector'"
            };

            const string pattern = @"(?<=')(\s*\+\s*|\s*\+\s*On\s*\+\s*)(?=')";

            foreach (string s in strings)
            {
                Console.WriteLine("input:"+s);
                string[] tokens = Regex.Split(s, pattern);
                foreach (string token in tokens)
                {
                    Console.WriteLine("token:->{0}<-", token);
                }                    
                //tokens.Where((x, i) => i % 2 == 0)  //single quoted strings
                //tokens.Where((x, i) => i % 2 != 0) //glue sequences
            }