gpt4 book ai didi

ios - 正则表达式只选择被特殊字符包围的单词

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:53:22 25 4
gpt4 key购买 nike

我想编写一个函数,它接受一个字符串并更改特殊字符中所有单词的颜色。例如:

This is a [Sample] String containing [sample words]

我想更改上面字符串中 [Sample][sample words] 的字体,因为它们都被特殊字符 [ ]

我尝试使用以下方法实现该功能:

NSMutableAttributedString * string = [[NSMutableAttributedString alloc]initWithString:_txtPostDiscussion.text];

NSArray *words=[_txtPostDiscussion.text componentsSeparatedByString:@" "];
for (NSString *word in words) {
if ([word hasPrefix:@"["] && [word hasSuffix:@"]"] ) {
NSRange range=[_txtPostDiscussion.text rangeOfString:[NSString stringWithFormat:@"%@ %@",pre,suf]];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:107.0/255.0 green:148.0/255.0 blue:187.0/255.0 alpha:1.0] range:range];

[_txtPostDiscussion setAttributedText:string];
}
}

我也曾尝试使用 Regex 来获取特定特殊字符内的所有单词,但我无法制作这样的正则表达式。

最佳答案

如果你想匹配[Sample maybe some _special_ *things* here],我们首先需要找到起始[。这个括号对正则表达式有特殊意义,所以在正则表达式中它必须用反斜杠“装饰”(转义),如下所示:\[。此外,反斜杠 \ 本身在 Objective-C 字符串中有特殊含义,因此它也必须使用第二个反斜杠进行转义,如下所示:@"\\["。或者,您可以使用 escapedPatternForString 方法为您进行转义。

NSString *openTagPattern = [NSRegularExpression escapedPatternForString:@"["];
NSString *closeTagPattern = [NSRegularExpression escapedPatternForString:@"]"];

然后我们要找到几个不同的字符,直到结束括号。语句“除 x 之外的任何字符”由 [^x] 编码,因此除结束括号外的任何字符均由 [^\]] 编码。括号 char 再次转义以按字面意思处理,在 Objective-C 字符串中,您将编写 @"[^\\]]"。因为我们想要找到 1 个或多个这样的字符,所以我们添加 +:

NSString *tagTextPattern = [NSString stringWithFormat:@"[^%@]+", closeTagPattern];

最后我们需要一个右括号。最终的正则表达式只是按顺序组合了这 3 种模式:

NSString *pattern = [NSString stringWithFormat:@"%@%@%@",
openTagPattern,
tagTextPattern,
closeTagPattern];

然后您可以创建一个 NSRegularExpression 实例并调用 enumerateMatchesInString 或 matchesInString 来为您提供所有匹配项。每个匹配项都是一个 NSTextCheckingResult 对象,它有一个 range 属性,用于向原始属性字符串添加一个属性。

如果您知道标签文本仅限于字母、数字和下划线,则可以将 tagTextPattern 简化为 \w+,即“一个或多个单词字符”,或者如果我们想要允许空格、制表符 (\s),模式将是 [\w\s]+,即“一个或多个单词或空格字符”(不要忘记正确转义它们)。

一个常见的错误是尝试表达式 \[.+\],即“左括号”、“任意字符中的一个”和“右括号”。这是行不通的,因为匹配算法是贪婪的(匹配越长越好),对于 .+ 子部分,它实际上也会吃掉右括号,以及之后的所有其他内容标记(] 之后的文本),并可能将多个标记连接成一个巨大的单个标记,或者可能无法匹配末尾的最后一个 ]

关于ios - 正则表达式只选择被特殊字符包围的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com