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例如
答案 0 :(得分:1)
编辑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
大。
答案 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添加到书签中,这是一个非常有用的工具。