【问题标题】:Swift - Regular Expression to match parenthesesSwift - 匹配括号的正则表达式
【发布时间】:2015-10-24 16:34:29
【问题描述】:

我正在尝试使用正则表达式搜索字符串:"K1B92 (D) [56.094]",并且我想获取"(D)",包括"D" 周围的括号。我很难找到与实际括号匹配的正确表达式,因为简单地放置括号会将其视为一个块,并尝试使用 "\" 转义括号,使其认为这是一个要评估的表达式。我还尝试使用"\\(" 转义"\(",如下所示:"\\([ABCD])\\)",但没有运气。这是我一直在使用的代码:

let str = "K1B92 (D) [56.094]"

let regex = NSRegularExpression(pattern: "\\b\\([ABCD])\\)\\b", options: NSRegularExpressionOptions.CaseInsensitive, error: nil)

let match = regex?.firstMatchInString(str, options: NSMatchingOptions.WithoutAnchoringBounds, range: NSMakeRange(0, count(str)))

let strRange = match?.range
let start = strRange?.location
let length = strRange?.length

let subStr = str.substringWithRange(Range<String.Index>(start: advance(str.startIndex, start!), end: advance(str.startIndex, start! + length!)))

// "\\b\([ABCD])\)\\b" returns range only for the letter "D" without parentheses.
// "\\b\\([ABCD])\\)\\b" returns nil

请指导我正确的表达方式吗?非常感谢。

【问题讨论】:

    标签: ios regex swift nsregularexpression


    【解决方案1】:

    \\([ABCD])\\) 部分没问题, 更正:正如@vacawama 在他的回答中正确所说的那样,括号 这里不匹配。 \\([ABCD]\\) 匹配字母 A-D 之一 括在括号中。

    另一个问题是没有字边界\b 模式)在空格和括号之间。

    因此,您可以(根据您的需要)删除 \b 模式,或者将它们替换为 \s 以获得空白:

    let regex = NSRegularExpression(pattern: "\\s\\([ABCD]\\)\\s", ...
    

    但是由于匹配的字符串不应该包含你需要的空间 一个捕获组:

    let regex = NSRegularExpression(pattern: "\\s(\\([ABCD]\\))\\s", ...
    // ...
    let strRange = match?.rangeAtIndex(1)
    

    【讨论】:

    • 我确实发现了她的括号问题,这是最初的问题,但你的回答是最完整的。我投了赞成票,认为它应该是公认的答案。 (在提及 OP 时,为正确使用代词更正了评论)
    • 这个解决方案效果很好。感谢 Martin R 和 Vacawama 及时回复。非常感谢
    【解决方案2】:

    您需要的正则表达式是"\\([ABCD]\\)"。在打开括号 ( 和关闭括号 ) 之前,您需要双重转义 \\

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2016-02-13
      相关资源
      最近更新 更多