首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用正则表达式处理某些字符的拆分

如何使用正则表达式处理某些字符的拆分
EN

Stack Overflow用户
提问于 2018-06-01 05:34:05
回答 1查看 72关注 0票数 1

在我的应用程序中,我尝试根据正则表达式模式将一个字符串拆分成一个数组。我希望能够加载我的volt模板,并通过我们的自定义渲染引擎运行它们-只是为了更多地了解渲染引擎是如何工作的。

为此,我编写了下面的正则表达式:

代码语言:javascript
复制
"(?s)(\\{\\{.*?\\}\\}|\\{%.*?%\\}|\\{#.*?#\\})"

这是一个这样的模板的例子:

代码语言:javascript
复制
# {{ title }}
{{created_at}} {{created_location}}
============
Paragraphs are separated by a blank line.
2nd paragraph. *Italic*, **bold**, and `monospace`.

Itemized lists look like:
{% for (item in items) %}
    * {{ item }}
{% endfor %}

现在,理想情况下,我希望将其转换为如下所示的数组:

代码语言:javascript
复制
[
    "# ",
    "{{ title }}",
    "\n",
    "{{created_at}}",
    " ",
    "{{created_location}}",
    "\n============\nParagraphs are separated by a blank line\n2nd paragraph. *Italic*, **bold**, and `monospace`.\n\nItemized lists look like:"
    "{% for (item in items) %}",
    "\n* {{ item }}\n",
    "{% endfor %}"
]

但是,当我运行上面的正则表达式时,我得到:

代码语言:javascript
复制
[
    "Paragraphs are separated by a blank line.\n2nd paragraph. *Italic*, **bold**, and `monospace`.\n\nItemized lists look like:",
    "{% for (item in items) %}\n* {{ item }}",
    "{% endfor %}\n"
]

如你所见,标题部分完全消失了。此外,换行符似乎存在一些问题。你知道我怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-04 16:59:39

问题不在正则表达式中,而是在我用来拆分正则表达式的代码中。我修改了下面的代码,也返回了正则表达式本身。

代码语言:javascript
复制
extension NSRegularExpression {
    func split(_ str: String) -> [String] {
        let range = NSRange(location: 0, length: str.characters.count)

        //get locations of matches
        var matchingRanges: [NSRange] = []
        let matches: [NSTextCheckingResult] = self.matches(in: str, options: [], range: range)
        for match: NSTextCheckingResult in matches {
            matchingRanges.append(match.range)
        }

        //invert ranges - get ranges of non-matched pieces
        var pieceRanges: [NSRange] = []

        //add first range
        pieceRanges.append(NSRange(location: 0, length: (matchingRanges.count == 0 ? str.characters.count : matchingRanges[0].location)))

        var endLoc: Int = 0
        var startLoc: Int = 0

        //add between splits ranges and last range
        for i in 0..<matchingRanges.count {
            let isLast = i + 1 == matchingRanges.count

            let location = matchingRanges[i].location
            let length = matchingRanges[i].length

            startLoc = location + length

            endLoc = isLast ? str.characters.count : matchingRanges[i + 1].location
            pieceRanges.append(NSRange(location: startLoc, length: endLoc - startLoc))
        }

        var pieces: [String] = []
        var previous: NSRange = NSRange(location: 0, length: 0)
        for range: NSRange in pieceRanges {
            let item = (str as NSString).substring(with: NSRange(location:previous.location+previous.length, length:range.location-(previous.location+previous.length)))
            pieces.append(item)

            let piece = (str as NSString).substring(with: range)
            pieces.append(piece)

            previous = range
        }

        return pieces
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50633111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档