首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配模式为[0-9]-[0-9]-[0-9],但不匹配[0-9]-[0-9]

匹配模式为[0-9]-[0-9]-[0-9],但不匹配[0-9]-[0-9]
EN

Stack Overflow用户
提问于 2010-09-28 01:15:43
回答 5查看 3K关注 0票数 3

我不确定如何使用正则表达式来实现这一点(或者我是否可以;我是regex的新手)。我有一个角度值供用户输入,我正在尝试验证输入。它的形式是度-分-秒。我遇到的问题是,如果用户输入了错误的秒部分,我必须捕获该错误,但我的度-分匹配是成功的。

也许这个方法能更好地解释:

代码语言:javascript
复制
    private Boolean isTextValid(String _angleValue) {

        Regex _degreeMatchPattern = new Regex("0*[1-9]");
        Regex degreeMinMatchPattern = new Regex("(0*[0-9]-{1}0*[0-9]){1}");
        Regex degreeMinSecMatchPattern = new Regex("0*[0-9]-{1}0*[0-9]-{1}0*[0-9]");

        Match _degreeMatch, _degreeMinMatch, _degreeMinSecMatch;

        _degreeMinSecMatch = degreeMinSecMatchPattern.Match(_angleValue);
        if (_degreeMinSecMatch.Success)
            return true;

        _degreeMinMatch = degreeMinMatchPattern.Match(_angleValue);
        if (_degreeMinMatch.Success)
            return true;

        _degreeMatch = _degreeMatchPattern.Match(_angleValue);
        if (_degreeMatch.Success)
            return true;

        return false;
    }
}

如果度-分-秒匹配不成功,我想检查度-分,但前提是用户没有输入任何秒数据。我能通过正则表达式做到这一点吗,或者我需要解析字符串并分别计算每个部分吗?谢谢。

编辑:样本数据将是45-23-10作为正确的数据。问题是45-23也是有效的数据;0秒是可以理解的。因此,如果用户输入45-23-1= on accident,我的代码中的degreeMinMatchPattern正则表达式将成功匹配,即使它是无效的。

第二次编辑:为了清楚起见,会议记录和第二部分都是可选的。用户可以键入45,这是有效的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-28 01:32:16

首先,默认情况下,正则表达式中的一个字符只匹配一次,因此{1}是多余的。

其次,由于您显然可以隔离此值(只提示输入此值,而不必在一段输入的数据中查找它),因此应该在字符串中包含^和$,以强制字符串仅包含此模式。

尝试"^\d{1,3}-\d{1,2}(-\d{1,2})?$“。

拆分:^匹配字符串的开头。\d匹配任何单个小数字符,然后在其后面指定{1,3},该{1,3}将匹配任何数字的一到三次出现。然后,您将查找一个破折号,然后是一个类似的小数模式,但只有一到两次。最后一项用括号括起来,这样我们就可以对字符进行分组。它的形式类似于前两个,然后有一个?这将前面的字符组标记为可选。末尾的$表示输入应该结束。因此,它将匹配222-33-44或222-33,但不匹配222-3344或222-33-abc。

请记住,您可能希望合并其他规则。例如,秒可以表示为小数(如果您希望分辨率小于一秒)。您需要选择性地期望小数点和一个或多个额外的数字。此外,您可能有一个最大度值;上面的正则表达式将匹配最大整数DMS值359-59-59,但是它也将匹配无效的999-99-99。您可以使用regex限制最大值(例如"(30-5\d|1- 2 \d{2}|\d{1,2})“将匹配从0到359的任何数字,方法是匹配3,然后是0-5,然后是0-9,或者任何以1或2开头的3位数字,或者任何两位数字),但是正如示例所示,regex将变得又长又乱,所以要在代码中很好地记录您正在做的事情。

票数 2
EN

Stack Overflow用户

发布于 2010-09-28 01:26:48

您可以使用{m,}语法指定“模式的这一部分必须至少匹配3次”。由于每个组件之间都有连字符,因此请单独指定第一部分,然后每个连字符-数字组合可以组合在一起,如下所示:

代码语言:javascript
复制
`[0-9](-[0-9]){2,}`

您还可以将[0-9]缩写为\d\d(-\d){2,}

票数 4
EN

Stack Overflow用户

发布于 2010-09-28 01:19:30

也许你会做得更好,只解析出输入,然后单独检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3806150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档