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

3
为什么下面的方法只检查提供的字符串中的第一个字符?
public static bool IsUnicodeSms(string message)
{
   var strMap = new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!""#%&'()*+,-./0123456789:;<=>? ¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}\[~]|€]+$");
   return !strMap.IsMatch(message);
}

所以例如以下字符串返回false:"abcლ",但"ლabc"返回true。

2
你是不是想转义那个倒数第二个]符号? - DLeh
此外,您还必须转义中间的“-”,以及可能的“\”,“[”和“|”。 - xanatos
我建议使用像 https://regex101.com/ 这样的在线工具来调试正则表达式。 - DLeh
这是翻译的文本 - ^[@£$¥èéùìòÇØøÅå_ÆæßÉ!""#%&'()*+,-./0123456789:;<=>? ¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}\[~\]|€]+$ - Wiktor Stribiżew
Post it as an answer - astralmaster
2个回答

4

你需要用\]来转义],并且在末尾加上-

将此更改为:

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

变为以下内容:

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

顺便提一下,您可以改进您的正则表达式并使用以下内容:
var strMap = new Regex(@"^[@£$¥èéùìòÇØøÅå_ÆæßÉ!"#%&'()*+,./\w:;<=>? ¡ÄÖÑܧ¿äöñüà^{}\[~\]|€-]+$");

不确定是否使用忽略大小写标志可以帮助您将其缩短为以下内容:

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

1
这些正则表达式不匹配空字符串,这可能是期望的。 - Armand
1
@Armand,这很容易做到,只需将“]+$”更改为“]*$”即可。 - Federico Piazza
1
我知道,只是不想编辑你的答案。我还怀疑这个字符不匹配换行符,而据我所知,换行符是一个有效的字符。 - Armand
1
@Armand 嗯,这个问题两个月前就解决了,我猜OP已经解决了这个问题,而且如果他把这个答案标记为正确的话,我想它也有所帮助。不过,还是谢谢你指出来。 - Federico Piazza
3
不是在针对你。"SO"是一个参考,同时也帮助原帖作者解决问题。这些评论是为了未来参考该问题的人而写的。 - Armand

2
你从这里复制了代码。

它有很多缺陷。需要进行更多的转义。来自正则表达式教程-字符类或字符集:

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

因此,应该这样写:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接