【问题标题】:REGEX to get Next Previous word正则表达式获取下一个上一个单词
【发布时间】:2015-06-14 20:45:21
【问题描述】:

我想要我用 REGEX 搜索的下一个和上一个单词,我可以通过如下模式获得。

在这种情况下,我已经搜索了单词 "the",所以我可以得到 "the" 的下一个和上一个单词。我可以通过以下模式成功获得。

'\\b(?=(\\w+\\s+the|the\\s+\\w+)\\b)'

但是使用这种模式,我遇到的一个问题是搜索的单词是页面中的第一个(“引用”,如果是下面的示例文本)或最后一个(“附件”,如果是下面的示例文本)它不会找到它。

示例文本

引用仲裁员在听证前应阅读的任何案件或其他法律材料附件

我也得到第一个和最后一个单词,但模式不同。 搜索词排在第一页时的模式。

第一个单词

'\\b(?=($+cite|cite\\s+\\w+)\\b)'

最后一句话

'\\b(?=(\\w+\\s+attachments|attachments+$)\\b)'

我想要所有这三种可能性,单一模式的天气词是第一个或最后一个或在中间。

已经用不同的组合进行了测试,但没有成功。

谁能帮我把所有这些都放在一个模式中,就像它应该为下一个/上一个单词提供结果?

【问题讨论】:

    标签: ios objective-c regex regex-lookarounds nsregularexpression


    【解决方案1】:

    我认为您可以使用以下使用可选捕获组的正则表达式捕获所有内容,无需使用交替:

    (\w+)?\s*\b(cite)\b\s*(\w+)?
    

    Demo

    不要忘记在 Objective C 中使用双转义斜线。

    Sample working code:

    #import <Foundation/Foundation.h>
    #import <Foundation/NSTextCheckingResult.h>
    
    int main (int argc, const char * argv[])
    {
       NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
        NSError *error = nil;
        NSString *pattern = @"(\\w+)?\\s*\\bcite\\b\\s*(\\w+)?";
        NSString *string = @"cite any cases or other legal materials cite that the arbitrator should read before the hearing attachments cite";
        NSRange range = NSMakeRange(0, string.length);
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
        NSArray *matches = [regex matchesInString:string options:0 range:range];
        for (NSTextCheckingResult *match in matches) {
           NSRange matchRange = [match range];
           NSString *m = [string substringWithRange:matchRange];
           NSLog(@"Matched string: %@", m);
        }
    
       [pool drain];
       return 0;
    }
    

    输出:

    2015-04-09 11:08:22.630 main[26] Matched string: cite any                                                                                                                                                                                              
    2015-04-09 11:08:22.633 main[26] Matched string: materials cite that                                                                                                                                                                                   
    2015-04-09 11:08:22.633 main[26] Matched string: attachments cite  
    

    【讨论】:

    • 谢谢,但这里有一个问题,它没有返回页面第一处的单词。
    • 嗨,我查过了。如您所见,它返回cite 3 次:从字符串的开头、中间和结尾。
    【解决方案2】:

    您可以使用这个:(\w+)?\s+cite(\s+\w+)?|cite\s+(\w+)?(\w+)?\s*\bcite\b\s*(\w+)?(假设 cite 令牌作为示例词)

    示例字符串:

    引用任何案件或其他法律材料引用仲裁员在听证附件引用之前应阅读

    匹配:

    • 任何
    • 材料
    • 那个
    • 附件

    DEMO

    【讨论】:

    • 这会给我提供您提供的单一模式的所有三种可能性吗?我的意思是引用是第一个字母或最后一个字母或中间任何地方。
    • “cite”在中间的情况下存在一个问题。在上面的演示示例中。它应该返回我“材料”(作为前一个词)和“那个”(作为下一个词)。
    • 好的,让我检查一下编辑后的答案,感谢您的反馈。
    • 根据演示是完美的,但是当我在我的 ios 应用程序中尝试时。当单词在任何地方的中间时,只给出前一个单词。
    • 试试这个..(\w+)?\s*cite\s*(\w+)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-09-07
    相关资源
    最近更新 更多