正则表达式格式有六个数字

时间:2015-03-23 16:56:23

标签: ios objective-c regex

I have this regular expression

 `NSString *expression = @"^([0-9]+)?(\\.?\\,?([0-9]{1,2})?)?$";`

 but i need a limit to 6 number before the dot or the comma and permit always two decimals.

如果有效,我可以用正则表达式检查每个字符。我可以写。

问题是我可以写XXXXXXXX(8个数字)而不是6个数字或(XXXXXX.XX)(8个数字和2个小数)例如这个表达式

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == _priceTf)
    {
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

        NSString *expression = @"^([0-9]{1,6})?(\\.?\\,?([0-9]{1,2})?)?$";

        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
                                                                               options:NSRegularExpressionCaseInsensitive
                                                                                 error:nil];
        NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
                                                            options:0
                                                              range:NSMakeRange(0, [newString length])];
        if (numberOfMatches == 0)
            return NO;
    }

    return YES;
}

修改 但是,如果你想验证例如" 666.66"。首先验证" 6"然后" 66"然后" 666"然后" 666。"并且所有这些都在正则表达式中有效。这是因为我有"?"在所有正则表达式中

但我也允许写.666例如

2 个答案:

答案 0 :(得分:1)

编辑2 :对于文字输入的增量有效性检查,这应该足够了:

NSString *expression = @"^[0-9]{0,6}([.,][0-9]{0,2})?$";

它匹配所有字符串:

  • 字符串以0到6位开头。
  • 该字符串可能包含可选的小数部分。
  • 小数部分以分隔符(.,)开头。
  • 小数部分最多两位数。
  • 处理字符串的整个长度,并且在之前的规则之外没有其他字符。

修改:看,我只是不明白你的问题。我在这里留下这个答案,因为它可能会帮助你到达你想去的地方,即使我不知道它在哪里。


听起来您希望将匹配的字符串限制为仅包含6位数,其中必须包含至少两位小数。这意味着您可以在该点的左侧最多包含4位数字。

您需要一个与这些条件中的每个条件匹配的正则表达式:

[.,][0-9]{2,6}         // 0 digits left of point
[0-9][.,][0-9]{2,5}    // 1 digits left of point
[0-9]{2}[.,][0-9]{2,4} // 2 digits left of point
[0-9]{3}[.,][0-9]{2,3} // 3 digits left of point
[0-9]{4}[.,][0-9]{2}   // 4 digits left of point

因为总字符串长度不是正则表达式匹配的东西,所以你不能在左侧的长度上使右侧依赖的长度。但是,如果你真的想要,你可以将所有这些组合成一个正则表达式。

NSString *expression = @"^([.,][0-9]{2,6})|([0-9][.,][0-9]{2,5})|([0-9]{2}[.,][0-9]{2,4})|([0-9]{3}[.,][0-9]{2,3})|([0-9]{4}[.,][0-9]{2})$";

我认为你最好还是这样:

NSString *expression = @"^[0-9]*[.,][0-9]{2,6}";

然后在比较之前检查字符串的长度,以确保它不比7大。

答案 1 :(得分:0)

在Regex中,使用间隔指定捕获量; 示例:\ d {0,4}捕获任意数量的数字,从0到4位。 在你的情况下:

NSString *expression = @"^([\\d]{1,6})([.]|[,])([\\d]{2,2})\\$";

你也需要逃避美元符号。

这是Regex101详细的正则表达式:

^(\d{1,6})([.]|[,])(\d{2,2})\$/
^ assert position at start of the string
1st Capturing group (\d{1,6})
\d{1,6} match a digit [0-9]
Quantifier: {1,6} Between 1 and 6 times, as many times as possible, giving back as needed [greedy]
2nd Capturing group ([.]|[,])
1st Alternative: [.]
[.] match a single character present in the list below
. the literal character .
2nd Alternative: [,]
[,] match a single character present in the list below
, the literal character ,
3rd Capturing group (\d{2,2})
\d{2,2} match a digit [0-9]
Quantifier: {2,2} Exactly 2 times
\$ matches the character $ literally

如果您打算经常使用Regex,请考虑将Regex101添加到书签中,这是一个非常有用的工具。