C# 从正则表达式获取文本字段输入范围
当文本框接收到焦点时,我想显示屏幕上的键盘。根据字段的输入范围,我可以显示几个键盘。问题是textbox的预期用户输入是服务器驱动的,我没有提供输入范围属性(我也不能添加)。事实上,我只有一个正则表达式来验证用户对字段的输入 基于任何正则表达式字符串,确定文本框输入范围的最佳方法是什么 输入范围包括:姓名(仅键盘上的字母)、电话号码(仅键盘上的数字)等C# 从正则表达式获取文本字段输入范围,c#,.net,regex,C#,.net,Regex,当文本框接收到焦点时,我想显示屏幕上的键盘。根据字段的输入范围,我可以显示几个键盘。问题是textbox的预期用户输入是服务器驱动的,我没有提供输入范围属性(我也不能添加)。事实上,我只有一个正则表达式来验证用户对字段的输入 基于任何正则表达式字符串,确定文本框输入范围的最佳方法是什么 输入范围包括:姓名(仅键盘上的字母)、电话号码(仅键盘上的数字)等 典型的正则表达式:“^[0-9]{4,4}$”,“^[0-9]{10,10}$”,但可能要复杂得多。硬编码正则表达式到输入类型的映射似乎是一种选
典型的正则表达式:“^[0-9]{4,4}$”,“^[0-9]{10,10}$”,但可能要复杂得多。硬编码正则表达式到输入类型的映射似乎是一种选择,但效果不佳 你知道有多少类输入吗?我想你会的。您需要创建一个与各种输入类相匹配的输入样本集,然后创建一个真值表来进行比较,如
EXAMPLE | PHONE | NAME | TEXT |
2061234567 | T | F | T |
206.123.4567 | T | F | T |
hello | F | T | T |
brian | F | T | T |
bADSFj@$$ | F | F | T |
以regex为字段,通过regex运行示例字符串,并将匹配与不匹配与将真值映射到输入类的表进行比较。下面是一个示例解决方案,不过您可能希望使用一些启发式方法,而不是进行精确匹配。(爪哇):
int PHONE_CLASS=0x18;//11000-上面的真值表值
...
地图键盘地图;
键盘映射。put(PHONE_类,phoneKeyboard);
...
键盘(模式正则表达式){
int匹配=0;
例如(字符串示例:示例){
matches=matches硬编码regex到输入类型的映射似乎是一个选项,但效果不佳
你知道有多少类输入吗?我假设你知道。你需要创建一个匹配不同输入类的输入样本集,然后制作一个真值表来比较,比如
EXAMPLE | PHONE | NAME | TEXT |
2061234567 | T | F | T |
206.123.4567 | T | F | T |
hello | F | T | T |
brian | F | T | T |
bADSFj@$$ | F | F | T |
以regex为字段,通过regex运行示例字符串,并将匹配与不匹配与将真值映射到输入类的表进行比较。下面是一个示例解决方案,尽管您可能希望使用一些启发式方法,而不是进行精确匹配。(Java):
int PHONE_CLASS=0x18;//11000-上面的真值表值
...
地图键盘地图;
键盘映射。put(PHONE_类,phoneKeyboard);
...
键盘(模式正则表达式){
int匹配=0;
例如(字符串示例:示例){
matches=matches诀窍是在正则表达式模式的if条件中指定每个输入范围的格式。我从电话号码开始,因为它似乎是最有限的;数字、破折号、句点斜杠)。然后我以自己的方式处理其他输入范围。请注意正则表达式电话模式不是超级健壮的,因此您可能需要对其进行调整。一旦找到检查正则表达式模式以查看将哪些文本放入命名的匹配捕获组。如果命名的匹配捕获组中有文本,viola!您已经确定了它是什么
此示例有三种类型,电话、地址(地址是数字,然后是空格,然后是文本),后跟默认的文本。但是您可以在内部添加更多的ifs。该模式带有注释以便于使用
void Main()
{
Console.WriteLine ("303-867-5309".DetermineScope() == InputScope.Phone); // True
Console.WriteLine ("1811 South Quebec Way".DetermineScope() == InputScope.Address); // True
Console.WriteLine ("Turk 181".DetermineScope() == InputScope.Text); // True
}
public enum InputScope
{
Phone, // Digits and dividers
Address, // number space then text
Text, // Everything is text...final catch all.
};
public static class TestCaseExtensions
{
public static InputScope DetermineScope(this string text)
{
string pattern = @"
(?(^[\d.\-/\\]+$) # If: First check for phone; just numbers and dividers (no spaces)
(?<Phone>[\d.\-/\\]+) # Place into Phone named capture group
| # Else: start a new check
(?(^\d+\s\w+) # If Check for address (if Address)
(?<Address>.*) # Looks like its an address, place into address capture group
| # Else
(?<Text>.*) # Nope just text, place into text capture group
)
)";
var result = InputScope.Text; // Default to the lowest...text
// Ignore allows us to document pattern; it is not related to processing text.
var match = Regex.Match(text, pattern, RegexOptions.IgnorePatternWhitespace);
if (match.Success)
{
result =
Enum.GetValues(typeof(InputScope))
.OfType<InputScope>()
.Where (tp => match.Groups[tp.ToString()].Success)
.First ();
}
return result;
}
}
void Main()
{
Console.WriteLine(“303-867-5309.DetermineScope()==InputScope.Phone);//True
Console.WriteLine(“1811南魁北克路”。DetermineScope()==InputScope.Address);//True
Console.WriteLine(“Turk 181.DetermineScope()==InputScope.Text);//True
}
公共枚举输入范围
{
电话,//数字和分频器
地址,//数字空间,然后是文本
Text,//一切都是Text…最终一网打尽。
};
公共静态类TestCaseExtensions
{
公共静态InputScope确定作用域(此字符串文本)
{
字符串模式=@“
(?(^[\d.\-/\\]+$)\If:首先检查电话;只有数字和分隔符(没有空格)
(?[\d.\-/\\]+)#放入名为capture group的手机中
|#否则:重新开始检查
(?(^\d+\s\w+)#如果检查地址(如果地址)
(?。诀窍是在正则表达式模式中指定if条件中每个输入范围的格式。我从电话号码开始,因为它似乎是最有限制的;数字、破折号、句点斜杠)。然后我以自己的方式与其他人交流。请注意,regex phone模式不是超级健壮的,因此您可能需要对其进行调整。一旦找到,请检查regex模式,以查看将哪些文本放入命名的匹配捕获组中。如果命名的匹配捕获组中有文本,viola!您已经识别出它是什么
此示例有三种类型,电话、地址(地址是数字,然后是空格,然后是文本),后跟默认的文本。但是您可以在内部添加更多的ifs。该模式带有注释以便于使用
void Main()
{
Console.WriteLine ("303-867-5309".DetermineScope() == InputScope.Phone); // True
Console.WriteLine ("1811 South Quebec Way".DetermineScope() == InputScope.Address); // True
Console.WriteLine ("Turk 181".DetermineScope() == InputScope.Text); // True
}
public enum InputScope
{
Phone, // Digits and dividers
Address, // number space then text
Text, // Everything is text...final catch all.
};
public static class TestCaseExtensions
{
public static InputScope DetermineScope(this string text)
{
string pattern = @"
(?(^[\d.\-/\\]+$) # If: First check for phone; just numbers and dividers (no spaces)
(?<Phone>[\d.\-/\\]+) # Place into Phone named capture group
| # Else: start a new check
(?(^\d+\s\w+) # If Check for address (if Address)
(?<Address>.*) # Looks like its an address, place into address capture group
| # Else
(?<Text>.*) # Nope just text, place into text capture group
)
)";
var result = InputScope.Text; // Default to the lowest...text
// Ignore allows us to document pattern; it is not related to processing text.
var match = Regex.Match(text, pattern, RegexOptions.IgnorePatternWhitespace);
if (match.Success)
{
result =
Enum.GetValues(typeof(InputScope))
.OfType<InputScope>()
.Where (tp => match.Groups[tp.ToString()].Success)
.First ();
}
return result;
}
}
void Main()
{
Console.WriteLine(“303-867-5309.DetermineScope()==InputScope.Phone);//True
Console.WriteLine(“1811南魁北克路”。DetermineScope()==InputScope.Address);//True
Console.WriteLine(“Turk 181.DetermineScope()==InputScope.Text);//True
}
公共枚举输入范围
{
电话,//数字和分频器
地址,//数字空间,然后是文本
Text,//一切都是Text…最终一网打尽。
};
公共静态类TestCaseExtensions
{
公共静态InputScope确定作用域(此字符串文本)
{
字符串模式=@“
(?(^[\d.\-/\\]+$)\If:首先检查电话;只有数字和分隔符(没有空格)
(?[\d.\-/\\]+)#放入名为capture group的手机中
|#否则:重新开始检查
(?(^\d+\s\w+)#如果检查地址(如果地址)
(?。你必须澄清你在做什么。如果正则表达式只能在用户输入文本后才能应用,那么InputScope的作用是什么?反转正则表达式以查看它是否需要字符串或数字会有过大的杀伤力。只需有一个字段列表,如果值应该是字符串或数字,然后使用该列表进行反求确定要显示的键盘。我正在使用正则表达式