正则表达式在UITextView的开头和结尾捕获单词

时间:2017-08-15 08:41:28

标签: regex swift

我试图捕捉cstub.c中使用单词的时间。我已经让它在视图内部的文字中工作了。

问题是视图中的第一个或最后一个字。 到目前为止我的代码:

UITextView

我检查过,发现我应该使用private func filteredTermFor(_ word: String) -> String { let punctuationFilter = "([\\A|\\W|\\d|\\z| ])" let wordInParens = "(\(word))" return punctuationFilter + wordInParens + punctuationFilter } 作为输入的开头,并使用^作为输入的结尾。当我添加其中任何一个时,例如:

$

当有问题的词是视图中的第一个或最后一个时,它们似乎没有任何效果。

*为了使我的问题变得冗长,上面函数的返回值被用作"([^|\\A|\\W|\\d|\\z| ])"

searchTerm

**编辑** 因为这被标记为重复 如果在没有空格的标点符号或数字旁边键入单词,则报告重复的问题不包括边缘情况。 例如: func highlightedTextInString(with searchTerm: String, targetString: String) -> NSAttributedString? { let attributedString = NSMutableAttributedString(string: targetString) do { let regex = try NSRegularExpression(pattern: searchTerm, options: .caseInsensitive) let range = NSRange(location: 0, length: targetString.utf16.count) for match in regex.matches(in: targetString, options: .withTransparentBounds, range: range) { let fontColor = UIColor.red attributedString.addAttribute(NSForegroundColorAttributeName, value: fontColor, range: match.range) } return attributedString } catch _ { print("Error creating regular expression") return nil } } .wordword9

1 个答案:

答案 0 :(得分:1)

请注意,var r = await a + await b; 是一个捕获组(([^|\\A|\\W|\\d|\\z| ])),其中包含与其中定义的单个char匹配的character class(...)之后的^使类成为否定,并且它匹配任何字符,但是匹配集合中定义的字符。因此,[匹配[^|\\A|\\W|\\d|\\z| ]以外的单个字符(它不再是字符类中的替换运算符),|(前面的A不被考虑,省略),非单词字符,数字,\和空格。它effectively matches z以及_A以外的任何字母。

您声明您需要匹配的字词可能出现在字词边界或数字中。

您可以使用

z

请参阅regex demo

在这里,return "(?<![^\\W\\d])(\(word))(?![^\\W\\d])" 是一个负面的后视,它匹配一个非紧接在非字和数字字符之外的字符的位置。这听起来很麻烦,但这里的要点是"(?<![^\\W\\d])"匹配与[^\W\d]相同的文本,不包括数字(\w匹配字母,数字和\w。所以_ 1}}确保在单词之前有一个字符串的开头或非字母和非"(?<![^\\W\\d])"字符。如果在_之后允许单词匹配,只需使用_(其中(?<!\\p{L})匹配任何Unicode字母)。

\p{L}是一个负向前瞻,确保字符串的结尾或非字母和非"(?![^\\W\\d])"(可能有标点符号,符号和数字)紧靠右侧这个单词。同样,如果您希望匹配跟随并使用_的单词,则可以将此前瞻替换为_(在允许该单词后不再使用任何字母)。< / p>