Swift Regex用于在括号

时间:2016-04-29 14:48:05

标签: regex swift

您好我想在()之间提取文本。

例如:

(some text) some other text -> some text
(some) some other text      -> some
(12345)  some other text    -> 12345

括号内字符串的最大长度应为10个字符。

(TooLongStri) -> nothing matched because 11 characters

我目前的情况是:

let regex   = try! NSRegularExpression(pattern: "\\(\\w+\\)", options: [])

regex.enumerateMatchesInString(text, options: [], range: NSMakeRange(0, (text as NSString).length))
{
    (result, _, _) in
        let match = (text as NSString).substringWithRange(result!.range)

        if (match.characters.count <= 10)
        {
            print(match)
        }
}

效果很好,但匹配是:

(some text) some other text -> (some text)
(some) some other text      -> (some)
(12345)  some other text    -> (12345)

且不匹配&lt; = 10因为()也被计算在内。

如何更改上面的代码来解决这个问题?我还希望通过扩展正则表达式来保留长度信息来删除if (match.characters.count <= 10)

2 个答案:

答案 0 :(得分:4)

您可以使用

"(?<=\\()[^()]{1,10}(?=\\))"

请参阅regex demo

模式:

  • (?<=\\() - 在当前位置之前声明存在(并且如果没有则失败则
  • [^()]{1,10} - 匹配()以外的1到10个字符(如果您只需要匹配字母数字/下划线字符,请将[^()]替换为\w
  • (?=\\)) - 检查当前位置后是否有文字),如果没有,则会失败。

如果您可以调整代码以获取范围1(捕获组)的值,则可以使用更简单的正则表达式:

"\\(([^()]{1,10})\\)"

请参阅regex demo。您需要的值在Capture group 1中。

答案 1 :(得分:2)

这将有效

\((?=.{0,10}\)).+?\)

<强> Regex Demo

这也可行

\((?=.{0,10}\))([^)]+)\)

<强> Regex Demo

正则表达式细分

\( #Match the bracket literally
(?=.{0,10}\)) #Lookahead to check there are between 0 to 10 characters till we encounter another )
([^)]+) #Match anything except )
\) #Match ) literally