【问题标题】:regular expression in iOSiOS 中的正则表达式
【发布时间】:2011-07-25 14:11:15
【问题描述】:

我正在寻找一个正则表达式来匹配以下-100..100:0.01。该表达式的含义是该值可以增加 0.01,并且应该在 -100 到 100 的范围内。

有什么帮助吗?

【问题讨论】:

  • “想用正则表达式解决这个问题”是什么意思?
  • 想要得到一个正则表达式,我可以在我的 iOS 应用程序中计算它。
  • -100..100:0.01是文字表示吗,或者你能举一些例子。否则就是浪费时间。
  • 表示取值范围为-100到100,中间值可以以0.01为增量,即只有小数点后2位。所以范围会像..[ -100.00, -99.99,-99.98,...,99.99,100.00 ]。希望这能给出清晰的思路。

标签: ios regex


【解决方案1】:
(\b|-)(100(\.0+)?|[1-9]?[0-9](\.[0-9]{1,2})?\b

解释:

(\b|-)      # word boundary or -
(           # Either match
 100        #  100
 (\.0+)?    #  optionally followed by .00....
|           # or match
 [1-9]?     #  optional "tens" digit
 [0-9]      #  required "ones" digit
 (          #  Try to match
  \.        #   a dot
  [0-9]{1,2}#   followed by one or two digits
 )?         #   all of this optionally
)           # End of alternation
\b          # Match a word boundary (make sure the number stops here).

【讨论】:

  • iOS 正则表达式求值器 NSPredicate 不理解 /b 和转义序列 :(
【解决方案2】:
          if(val>= -100 && val <= 100)
    {
        NSString* valregex = @"^[+|-]*[0-9]*.[0-9]{1,2}"; 
        NSPredicate* valtest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", valregex]; 
        ret = [valtest evaluateWithObject:txtLastname.text];
        if (!ret)
        {
            [alert setMessage:NSLocalizedString(@"More than 2 decimals", @"")];
            [alert show];       
        }
    }

工作正常..谢谢你们的努力!

【讨论】:

    【解决方案3】:

    为什么要使用正则表达式?为什么不直接做类似的事情(在伪代码中):

    is number between -100 and 100?
      yes:
        multiply number by 100
        is number an integer?
          yes: you win!
          no:  you don't win!
      no:
        you don't win!
    

    【讨论】:

      【解决方案4】:

      您可以改用NSRegularExpression。它确实支持\b,顺便说一句,尽管您必须在字符串中对其进行转义:

      NSString *regex = @"\\b-?1?[0-9]{2}(\\.[0-9]{1,2})?\\b";
      

      不过,我认为\\W 会更好,因为\\b 会搞砸检测数字上的负号。

      一个希望更好的例子:

      NSString *string = <...your source string...>;
      NSError  *error  = NULL;
      
      NSRegularExpression *regex = [NSRegularExpression 
        regularExpressionWithPattern:@"\\W-?1?[0-9]{2}(\\.[0-9]{1,2})?\\W"
                             options:0
                               error:&error];
      
      NSRange range   = [regex rangeOfFirstMatchInString:string
                                    options:0 
                                    range:NSMakeRange(0, [string length])];
      NSString *result = [string substringWithRange:range];
      

      我希望这会有所帮助。 :)

      编辑:根据以下评论修复。

      【讨论】:

      • NSRange *range 应该是NSRange range
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      相关资源
      最近更新 更多