在c#中使用RegEx检查有效字符

时间:2017-08-23 14:26:50

标签: c# regex

我很难理解正则表达式。我有一个场景,其中有效字符是a-z,A-Z,0-9和空格。因此,当我尝试为无效字符创建一个RegEx时,我有这个,[^ a-zA-Z0-9]。 然后我有基于RegEx搜索的字符串,当它找到无效字符时,它会检查它前面的字符是否无效。 例如,“测试测试+?测试” 所以我想要发生的是,如果有两个无效字符,一个接一个,不做任何其他事情,否则插入'£'。所以上面的字符串会很好,没有变化。但是,字符串“test test£test”应更改为“test test test test”。

这是我的代码..

public string HandleInvalidChars(string message)
    {
        const string methodName = "HandleInvalidChars";

        Regex specialChars = new Regex("[^a-zA-Z0-9 ]");
        string strSpecialChars = specialChars.ToString();

        //prev character in string which we are going to check 
        string prevChar;

        Match match = specialChars.Match(message); 

        while (match.Success) 
        {

            //get position of special character
            int position = match.Index;

            // get character before special character
            prevChar = message.Substring(position - 1, 1);

            //check if next character is a special character, if not insert ? escape character
            try
            {
                if (!Regex.IsMatch(prevChar, strSpecialChars))
                {

                    message = message.Insert(position, "?");

                }
            }
            catch (Exception ex)
            {
                _logger.ErrorFormat("{0}: ApplicationException: {1}", methodName, ex);
                return message;
            }


            match = match.NextMatch();
            //loop through remainder of string until last character

        }

        return message;
    }

当我在第一个字符串上测试时,它会处理第一个无效的字符“+”,确定但是当它达到“£”时它就会崩溃。

非常感谢任何帮助。

谢谢:)

2 个答案:

答案 0 :(得分:0)

如果您将RegEx更改为如下所示,仅检查具有一个特殊字符但不包含两个特殊字符的情况会怎样?

[a-zA-Z0-9 ]{0,1}[^a-zA-Z0-9 ][a-zA-Z0-9 ]{0,1}

另一件事,我会为返回值创建一个新变量。我可以看到你一直在改变你正在寻找火柴的原始字符串。

答案 1 :(得分:0)

我相信你有点过分了。您所需要的只是找到一个禁止使用的字符,该字符串不在其他禁止字符之前或后面。

声明

public string HandleInvalidChars(string message)
{
    var pat = @"(?<![^A-Za-z0-9 ])[^A-Za-z0-9 ](?![^A-Za-z0-9 ])";
    return Regex.Replace(message, pat, "£$&");
}

并使用:

Console.WriteLine(HandleInvalidChars("test test £test"));
// => test test ££test
Console.WriteLine(HandleInvalidChars("test test +?test"));
// => test test +?test

请参阅online C# demo

<强>详情

  • (?<![^A-Za-z0-9 ]) - 如果在当前位置的左侧有一个除ASCII字母/数字或空格以外的字符,则会导致匹配失败的负面观察
  • [^A-Za-z0-9 ] - ASCII字母/数字或空格以外的字符
  • (?![^A-Za-z0-9 ]) - 如果在当前位置右侧有一个除ASCII字母/数字或空格以外的字符,则会导致匹配失败的否定前瞻。

替换字符串包含$&,对整个匹配值的反向引用。因此,使用"£$&"我们会在匹配前插入£

请参阅regex demo

enter image description here