为什么以下方法只检查提供的字符串中的第一个字符?
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。
答案 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演示一样。