【问题标题】:My regex is returning nil everytime in obj-c, example code included我的正则表达式在 obj-c 中每次都返回 nil,包括示例代码
【发布时间】:2017-08-26 23:18:47
【问题描述】:

编辑我澄清了我在字符串中存储的确切文本。

所以这是我的正则表达式https://regex101.com/r/fWFRya/5 - 这有错误的字符串 zz,这就是为什么每个人都对我的错误感到困惑,现在又修复了

^.*?".*?:\s+(?|(?:(.*?[!.?])\s+.*?)|(.*?))".*$

这是它在我的代码中的外观,反斜杠添加到转义引号

NSString *regexTweet = @"^.*?\".*?:\\s+(?|(?:(.*?[!.?])\\s+.*?)|(.*?))\".*$";
//the example string contains the text>   @user hey heres my message: first message: and a second colon! haha.
      NSString *example1 = @"@user hey heres my message: first message: and a second colon! haha.";
  NSError *regexerror = nil;
  NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexTweet options:NSRegularExpressionCaseInsensitive error:&regexerror];

  NSRange range = [regex rangeOfFirstMatchInString:example1
  options:0
  range:NSMakeRange(0, [example1 length])];
  NSString *final1 = [example1 substringWithRange:range];
  HBLogDebug (@"example 1 has become %@", final1);

当我登录 final1 时,它总是返回 nil,我无法弄清楚哪里出了问题,如果有人能帮我一把,我将不胜感激

预期输出为

第一条消息:和第二个冒号!

【问题讨论】:

  • 将示例行更改为NSString *example1 = @"\"@user hey heres my message: first message: and a second colon! haha.\"";,它应该可以工作。检查您的引擎是否支持分支重置构造 (?|..) 如果不支持,则它不是真正需要的,并且可以将其作为一个集群组来完成 ^.*?".*?:\s+(?:(?:(.*?[!.?])\s+.*?)|(.*?))".*$ 答案只是 $1$2 的串联,因为只有一个组可以包含一个字符串。这将保持您现在正在做的修剪完好无损。
  • @sln 我在那个正则表达式链接中有错误的字符串(我在这里修复它时忘记更改它),你能再检查一下吗?对不起
  • 您可能有心理障碍。正则表达式只会匹配包含 2 个双引号的字符串。要制作语言字符串,必须对这些引号进行转义。 string var = " <- begin of string, quote 1 \" and quote 2 \" end of string ->";

标签: ios objective-c regex nsstring


【解决方案1】:

首先,您为NSString *example1 = @("@user hey heres my message: first message: and a second colon! haha"); 创建了一个正则表达式,但您在代码中传递给正则表达式引擎的字符串是@user hey heres my message: first message: and a second colon! haha

我假设您需要匹配像Text.. "@user hey heres my message: first message: and a second colon! haha" 这样的字符串

注意ICU regex library 不支持Branch Reset Groups

我建议将分支重置组更改为带有交替组的捕获组

^.*?:\s+(.*?[!.?](?=\s)|[^"]*).*$

regex demo

详情

  • ^ - 字符串的开头
  • .*?: - 任何 0+ 字符,直到第一个 : 后跟
  • \s+ - 1 个或多个空格...
  • (.*?[!.?](?=\s)|[^"]*) - 第 1 组捕获任一
    • .*?[!.?](?=\s) - 尽可能少的任何 0+ 个字符,直到第一个 !.?,后跟空格
    • | - 或
    • [^"]* - 除" 之外的零个或多个字符
  • .*$ - 任何 0+ 字符直到字符串结尾

您只需访问第 1 组即可获得所需的价值。查看示例Objective-C demo

【讨论】:

  • 我修复了字符串,我记录的太多了,在这里写的时候不小心把它们弄混了。尚未能够使您的上述建议起作用(可能是因为假设并不完全是我想要的,这是我写错的错误)如果您能再看一下,将不胜感激
  • 首先让我确保输入正确。 Does it look like this?
猜你喜欢
  • 2011-07-31
  • 1970-01-01
  • 2014-11-15
  • 2015-01-25
  • 2010-11-08
  • 2019-04-05
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多