在我的应用程序中,我根据服务器提供的响应添加了编辑文本。对于每个 edittext 服务器还提供正则表达式模式来匹配。我能够成功地匹配模式并进行验证。但我想确定正则表达式模式的类型,以便我可以根据 edittext 应该接受的值打开键盘。
例如, 如果 edittext 应该接受电子邮件地址,那么带有 @ 符号的键盘会打开,如果 edittext 接受数字值,它应该打开数字键盘。
是否有任何库可以从其正则表达式模式返回类型,例如“电子邮件”、“数字”等正则表达式,因为可以有几种不同类型的正则表达式模式?
编辑:我知道如何为 edittext 设置输入类型,但我需要从正则表达式模式中找出类型。我无法在服务器中进行更改,我必须在客户端处理此问题。
最佳答案
很可能没有。原因是——没有办法确定。您能想到的任何事情都是启发式的。
启发式一:
- 如果该模式查找包含点、后跟@ 符号和包含点 的内容 - 这是电子邮件验证.
- 如果模式仅包含
\d
,或数字范围 ([1-5]
),或单个数字 (7
) 加重复元字符(?
、*
、+
、{4, 12}
),这是一个数字验证。 - 如果模式包含
\w
且没有 @ 符号,则它是常规文本。 继续本着同样的精神。
- + 高度控制。当您发现结果在某些情况下不准确时,您可以随时添加新的猜测
- - 需要更多代码来实现
- - 需要非常了解正则表达式
启发式二:
使用您知道其类型的字符串列表,并尝试将它们与正则表达式匹配。也就是,对于电子邮件请尝试 example@gmail.com
。
- + 易于实现。小概率有问题的逻辑
- - 最少的控制。如果服务器为您提供不同域的电子邮件模式,您无法猜测这是一个电子邮件模式,除非您知道所有可能的域
启发式三:
使用可以从正则表达式生成示例字符串并将它们与您自己的正则表达式匹配以确定类型的库。这是一个 Java另一个 JavaScript .
- + 很好地结合了高度控制和易于实现
- - 你仍然需要编写自己的正则表达式(不像第二个启发式那么简单)
- - 人们有时会编写允许某些误报的正则表达式。因此,生成的字符串可能不是完美的格式(没有第一个启发式那么多控制)
正则表达式是静态的吗?
- 如果是 - 你应该制作一个映射并使用它。
- 如果不是 - 使用上述方法之一的启发式方法,并随着时间的推移改进它,因为您获得了更多关于生成的正则表达式通常看起来如何的统计数据。
关于android - 识别正则表达式模式的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946536/