正则表达式只检查字符串C#中的第一个字符

时间:2015-04-09 14:46:31

标签: c# regex

为什么以下方法只检查提供的字符串中的第一个字符?

public static bool IsUnicodeSms(string message)
{
   var strMap = new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!""#%&'()*+,-./0123456789:;<=>? ¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}\[~]|€]+$");
   return !strMap.IsMatch(message);
}

例如,以下字符串返回false:&#34; abcლ&#34;但是&#34;ლabc&#34;返回true。

2 个答案:

答案 0 :(得分:3)

您必须使用]转义\],并将-放在最后:

改变这个:

var strMap = new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!""#%&'()*+,-./0123456789:;<=>? ¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}\[~]|€]+$");

对此:

var strMap = new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!""#%&'()*+,./0123456789:;<=>? ¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}\[~\]|€-]+$");

顺便说一下,你可以改善你的正则表达式并使用:

var strMap = new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!"#%&'()*+,./\w:;<=>? ¡ÄÖÑܧ¿äöñüà^{}\[~\]|€-]+$");

并且不确定使用ignore case标志是否可以帮助您将它缩短一点:

var strMap = new Regex(@"(?i)^[@£$¥èéùìòÇøå_Ææß!"#%&'()*+,./\w:;<=>? ¡§¿äöñüà^{}\[~\]|€-]+$");

答案 1 :(得分:2)

您从here复制了代码。

这是非常有缺陷的。它需要更多的逃避。来自Regexp Tutorial - Character Classes or Character Sets

  

字符类中唯一的特殊字符或元字符是右括号(]),反斜杠(\),插入符号(^)和连字符( - )

所以,它必须是:

new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!""#%&'()*+,\-./0123456789:;<=>? ¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}\[~\]|€]+$");

你当然可以进一步改进正则表达式,就像@Fede演示一样。