ios - 具有六个数字的正则表达式格式

标签 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 个数字)但不能写六个数字或 (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:对于文本输入的增量有效性检查,这应该足够了:

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

它匹配所有字符串,例如:

  • 字符串以零到六位数字开头。
  • 字符串可以有一个可选的小数部分。
  • 小数部分以分隔符开头(.,)。
  • 小数部分最多为两位数。
  • 处理字符串的整个长度,并且不存在先前规则之外的其他字符。

编辑:听着,我只是不明白你的问题。我将这个答案留在这里,因为它可能会帮助您到达您想去的地方,即使我不知道那在哪里。


听起来您想将匹配的字符串限制为仅包含 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

关于ios - 具有六个数字的正则表达式格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29215924/

相关文章:

iOS uitableview reloadData 不太好用

java - 如何通过在属性周围加上引号来清理用于 Java 解析的 XML 文件

c# - Regex.Replace 对特殊字符失败

iphone - 如何判断 NSOperation 已经执行了多长时间?

iphone - RemoveAllObjects 等效于 NSArray

ios - SCN Material 防止拉伸(stretch)

ios - MapkIt 坐标正在更改

objective-c - UIImage 是否缓存图像?

ios - 如何将 "Log In via Twitter"凭据从 Rails 后端传递到 iPhone 应用程序?

c# - 如何避免正则表达式中除空格外的所有特殊字符?