问题 表单验证仅允许英文字母字符


我想限制我的表单输入输入非英文字符。例如,所有中文,日文,Cyrllic,还有单个字符,如:à,â,ù,û,ü,ô,î,ê。这可能吗?我是否必须在我的MVC应用程序上设置区域设置,或者只是进行正则表达式文本框验证?只是旁注,我希望能够输入数字和其他字符。我只想要这个以排除字母。

请指教,谢谢


5020
2018-03-08 23:01


起源



答案:


为此,您必须使用Unicode字符属性和块。每个Unicode代码点都分配了一些属性,例如这一点是一封信。块是代码点范围。

有关详细信息,请参阅:

编写那些Unicode属性和块 \p{Name},其中“Name”是属性或块的名称。

当它是这样的大写“P”时 \P{Name},然后它是属性/块的否定,即它匹配任何其他东西。

例如有一些属性(只是一个简短的摘录):

  • L ==>所有字母字符。
  • Lu ==> Letter,大写
  • Ll ==> Letter,小写
  • N ==>所有数字。这包括Nd,Nl和No类别。
  • Pc ==>标点符号,连接符
  • P ==>所有标点字符。这包括Pc,Pd,Ps,Pe,Pi,Pf和Po类别。
  • Sm ==>符号,数学

例如有一些块(只是一个简短的摘录):

  • 0000 - 007F ==> IsBasicLatin
  • 0400 - 04FF ==> IsCyrillic
  • 1000 - 109F ==> IsMyanmar

我在解决方案中使用的内容:

\P{L} 是一个匹配任何非字母字符的字符属性(Letter为“L”)

\p{IsBasicLatin} 是一个与代码点0000 - 007F匹配的Unicode块

所以你的正则表达式是:

^[\P{L}\p{IsBasicLatin}]+$

用简单的话说:

这匹配从开头到结尾的字符串(^ 和 $),当(至少有一个)ASCII表中只有非字母或字符时(doce points 0000 - 007F)

一个简短的c#测试方法:

string[] myStrings = { "Foobar",
    "Foo@bar!\"§$%&/()",
    "Föobar",
    "fóÓè"
};

Regex reg = new Regex(@"^[\P{L}\p{IsBasicLatin}]+$");

foreach (string str in myStrings) {
    Match result = reg.Match(str);
    if (result.Success)
        Console.Out.WriteLine("matched ==> " + str);
    else
        Console.Out.WriteLine("failed ==> " + str);
}

Console.ReadLine();

打印:

匹配==> Foobar
  匹配==> Foo @ bar!\“§$%&/()
  失败==>Föobar
  失败==>fóÓè


9
2018-03-13 07:41



岂不 [\P{L}\p{IsBasicLatin}] 匹配非英语非字母?例如其他类型的数字,如01234?我不认为这是理想的。好像他只想要匹配基本的ASCII字符。 - Qtax
当然是。这就是我所理解的,只是排除非ASCII字母(并匹配所有其他Unicode字符)。如果这种理解是错误的,那么解决方案非常简单并且已经接受了已接受的答案,但这是非常基本的正则表达式知识,并不能证明是值得的。 - stema


答案:


为此,您必须使用Unicode字符属性和块。每个Unicode代码点都分配了一些属性,例如这一点是一封信。块是代码点范围。

有关详细信息,请参阅:

编写那些Unicode属性和块 \p{Name},其中“Name”是属性或块的名称。

当它是这样的大写“P”时 \P{Name},然后它是属性/块的否定,即它匹配任何其他东西。

例如有一些属性(只是一个简短的摘录):

  • L ==>所有字母字符。
  • Lu ==> Letter,大写
  • Ll ==> Letter,小写
  • N ==>所有数字。这包括Nd,Nl和No类别。
  • Pc ==>标点符号,连接符
  • P ==>所有标点字符。这包括Pc,Pd,Ps,Pe,Pi,Pf和Po类别。
  • Sm ==>符号,数学

例如有一些块(只是一个简短的摘录):

  • 0000 - 007F ==> IsBasicLatin
  • 0400 - 04FF ==> IsCyrillic
  • 1000 - 109F ==> IsMyanmar

我在解决方案中使用的内容:

\P{L} 是一个匹配任何非字母字符的字符属性(Letter为“L”)

\p{IsBasicLatin} 是一个与代码点0000 - 007F匹配的Unicode块

所以你的正则表达式是:

^[\P{L}\p{IsBasicLatin}]+$

用简单的话说:

这匹配从开头到结尾的字符串(^ 和 $),当(至少有一个)ASCII表中只有非字母或字符时(doce points 0000 - 007F)

一个简短的c#测试方法:

string[] myStrings = { "Foobar",
    "Foo@bar!\"§$%&/()",
    "Föobar",
    "fóÓè"
};

Regex reg = new Regex(@"^[\P{L}\p{IsBasicLatin}]+$");

foreach (string str in myStrings) {
    Match result = reg.Match(str);
    if (result.Success)
        Console.Out.WriteLine("matched ==> " + str);
    else
        Console.Out.WriteLine("failed ==> " + str);
}

Console.ReadLine();

打印:

匹配==> Foobar
  匹配==> Foo @ bar!\“§$%&/()
  失败==>Föobar
  失败==>fóÓè


9
2018-03-13 07:41



岂不 [\P{L}\p{IsBasicLatin}] 匹配非英语非字母?例如其他类型的数字,如01234?我不认为这是理想的。好像他只想要匹配基本的ASCII字符。 - Qtax
当然是。这就是我所理解的,只是排除非ASCII字母(并匹配所有其他Unicode字符)。如果这种理解是错误的,那么解决方案非常简单并且已经接受了已接受的答案,但这是非常基本的正则表达式知识,并不能证明是值得的。 - stema


您可以在ViewModel上使用正则表达式属性来限制它

public class MyViewModel
{
    [System.ComponentModel.DataAnnotations.RegularExpression("[a-zA-Z]+")]
    public string MyEntry
    {
       get;
       set;
    }
}

1
2018-03-08 23:07



这匹配a-z和A-Z如何关于0-9和其他字符:/。,;'[] - =等等。 - Hubert Jarema
我添加了一个答案,是否会进入你期望的方向“一个详细的规范答案“ - stema


你可以使用正则表达式 [\x00-\x80]+ 要么 [\u0000-\u0080]+。没有测试但认为它应该在C#中工作。

改编自: 正则表达式匹配非英文字符?

您可以对文本框使用正则表达式验证,也可以在服务器上进行验证。


1
2018-03-08 23:43





也许这一个帮助你:=

private void Validate(TextBox textBox1)
{
 Regex rx = new Regex("[^A-Z|^a-z|^ |^\t]");
 if (rx.IsMatch(textBoxControl.Text))
  throw new Exception("Your error message");
}

有用的链接: -

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84e4f7fa-5fff-427f-8c0e-d478cb38fa12

http://www.c-sharpcorner.com/Forums/Thread/177046/allow-only-20-alphabets-and-numbers-in-textbox-using-reg.aspx


1
2018-03-14 12:59





这可能有所帮助,但不是有效的方式,而是简单的非reg验证

foreach (char c in inputTextField)
{
       if ((int)(c) > 127)
          {
             // expection or your logic whatever you want to return
          }

 }

0
2018-03-09 00:48