Swift - 正则表达式匹配括号

时间:2015-08-02 13:52:56

标签: ios regex swift nsregularexpression

我正在尝试使用正则表达式搜索字符串:"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

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

2 个答案:

答案 0 :(得分:5)

\\([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)

答案 1 :(得分:4)

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