【问题标题】:Exclude pattern in NSRegularExpression在 NSRegularExpression 中排除模式
【发布时间】:2018-05-14 18:46:44
【问题描述】:

想象下面的句子:

The **quick** brown **fox** ...

如果我运行以下regex

let boldPattern = "\\*{2}([\\w ]+)\\*{2}"

let boldRegex = try NSRegularExpression(pattern: boldPattern)

let str = "The **quick** brown **fox** ..."

let results = regex.matches(in: str, range: NSRange(str.startIndex..., in: str))

results.forEach {
    print("$0")
}

我能够得到**之间的所有单词。

我读过关于负正则表达式的文章,它会返回除我们试图“避免”的单词之外的所有单词。

鉴于上面的句子,有没有办法使用否定的regex 来获得与boldPattern 不匹配的单词,所以我会得到The brown ...,避免**words**??

编辑

我正在寻找围绕这种模式 ((?!\\*{2}([\\w ]+)\\*{2}).*) 的东西,搜索不以 ** word ** 开头的单词的东西

【问题讨论】:

  • 实际上* 是问题,如果它是任何其他字符会更容易。 * 本身在正则表达式中有其含义。
  • @TheTiger 是的,你是对的。我不知道如何解决这个问题。正则表达式太难了。
  • 在哪种情况下您的正则表达式工作错误?
  • @TheTiger 它不打印任何错误,但不匹配任何文本。这可能是正则表达式字符串中的拼写错误。
  • 你正在打印print("$0"),无论你用双引号写什么,它都会是一个字符串,因此即使在匹配之后,它也会每次都打印硬编码的$0。它应该类似于results.forEach { (value) in let range = value.range let matchString = (str as NSString).substring(with: range) as String print(matchString) }

标签: ios swift nsregularexpression


【解决方案1】:

一种方法是使用NSRegularExpressionstringByReplacingMatches 方法。

例子:

let boldPattern = "\\*{2}([\\w ]+)\\*{2}"
let boldRegex = try NSRegularExpression(pattern: boldPattern)
let str = "The **quick** brown **fox** ..."

let unmatchedString = boldRegex.stringByReplacingMatches(in: str, options: [], range: NSMakeRange(0, str.count), withTemplate: "")
print(unmatchedString)
// prints: The  brown  ...

【讨论】:

  • 这肯定会帮助我解决我的问题,尽管我以后可能会遇到问题。我想我的问题格式错误。假设我有一个带有 **tag** 的粗体文本,后来我删除了一个 * 字符,所以它与粗体模式不匹配。我想要做的是应用默认文本样式,去掉粗体属性,因此我需要遍历字符串并“避免”那些粗体模式,所以我不会将默认属性应用于它。即使你的回答回答了我的问题,所以我会接受它是正确的。
猜你喜欢
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
相关资源
最近更新 更多