{"id":20709630,"url":"https://github.com/go-andiamo/splitter","last_synced_at":"2025-04-23T04:47:49.427Z","repository":{"id":62865485,"uuid":"557447917","full_name":"go-andiamo/splitter","owner":"go-andiamo","description":"Go package for splitting strings (enclosing bracket and quotes aware)","archived":false,"fork":false,"pushed_at":"2022-10-30T19:16:42.000Z","size":59,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T22:12:00.889Z","etag":null,"topics":["go","golang","split","splitter","splitting","string"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/go-andiamo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-10-25T17:54:33.000Z","updated_at":"2024-11-25T04:19:42.000Z","dependencies_parsed_at":"2022-11-08T06:32:09.230Z","dependency_job_id":null,"html_url":"https://github.com/go-andiamo/splitter","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-andiamo%2Fsplitter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-andiamo%2Fsplitter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-andiamo%2Fsplitter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/go-andiamo%2Fsplitter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/go-andiamo","download_url":"https://codeload.github.com/go-andiamo/splitter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250372938,"owners_count":21419722,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","split","splitter","splitting","string"],"created_at":"2024-11-17T02:07:21.916Z","updated_at":"2025-04-23T04:47:49.409Z","avatar_url":"https://github.com/go-andiamo.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Splitter\n[![GoDoc](https://godoc.org/github.com/go-andiamo/splitter?status.svg)](https://pkg.go.dev/github.com/go-andiamo/splitter)\n[![Latest Version](https://img.shields.io/github/v/tag/go-andiamo/splitter.svg?sort=semver\u0026style=flat\u0026label=version\u0026color=blue)](https://github.com/go-andiamo/splitter/releases)\n[![codecov](https://codecov.io/gh/go-andiamo/splitter/branch/main/graph/badge.svg?token=igjnZdgh0e)](https://codecov.io/gh/go-andiamo/splitter)\n[![Go Report Card](https://goreportcard.com/badge/github.com/go-andiamo/splitter)](https://goreportcard.com/report/github.com/go-andiamo/splitter)\n\n## Overview\n\nGo package for splitting strings (aware of enclosing braces and quotes)\n\nThe problem with standard Golang `strings.Split` is that it does not take into consideration that the string being split may\ncontain enclosing braces and/or quotes (where the separator should not be considered where it's inside braces or quotes)\n\nTake for example a string representing a slice of comma separated strings...\n```go\n    str := `\"aaa\",\"bbb\",\"this, for sanity, should not be split\"`\n```\nrunning `strings.Split` on that...\n```go\npackage main\n\nimport \"strings\"\n\nfunc main() {\n    str := `\"aaa\",\"bbb\",\"this, for sanity, should not be parts\"`\n    parts := strings.Split(str, `,`)\n    println(len(parts))\n}\n```\nwould yield 5 ([try on go-playground](https://go.dev/play/p/bEnwjc-gfQS)) - instead of the desired 3\n\nHowever, with splitter, the result would be different...\n```go\npackage main\n\nimport \"github.com/go-andiamo/splitter\"\n\nfunc main() {\n    commaSplitter, _ := splitter.NewSplitter(',', splitter.DoubleQuotes)\n\n    str := `\"aaa\",\"bbb\",\"this, for sanity, should not be split\"`\n    parts, _ := commaSplitter.Split(str)\n    println(len(parts))\n}\n```\nwhich yields the desired 3! [try on go-playground](https://go.dev/play/p/lIae-RjzSe6)\n\nNote: The varargs, after the first separator arg, are the desired 'enclosures' (e.g. quotes, brackets, etc.) to be taken\ninto consideration\n\nWhile splitting, any enclosures specified are checked for balancing!\n\n## Installation\nTo install Splitter, use go get:\n\n    go get github.com/go-andiamo/splitter\n\nTo update Splitter to the latest version, run:\n\n    go get -u github.com/go-andiamo/splitter\n\n## Enclosures\nEnclosures instruct the splitter specific start/end sequences within which the separator is not to be considered.  An enclosure can be one of two types: quotes or brackets.\n\nQuote type enclosures only differ from bracket type enclosures in the way that their optional escaping works -\n* Quote enclosures can be:\n  * escaped by escape prefix - e.g. a quote enclosure starting with `\"` and ending with `\"` but `\\\"` is not seen as ending\n  * escaped by doubles - e.g. a quote enclosure starting with `'` and ending with `'` but any doubles `''` are not seen as ending \n* Bracket enclosures can only be:\n    * escaped by escape prefix - e.g. a bracket enclosure starting with `(` and ending with `)` and escape set to \u003ccode\u003e\u0026#92;\u003c/code\u003e\n      * `\\(` is not seen as a start\n      * `\\)` is not seen as an end\n\nNote that brackets are ignored inside quotes - but quotes can exist within brackets.  And when splitting, separators found within any specified quote or bracket enclosure are not considered. \n\n\nThe Splitter provides many pre-defined enclosures:\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003e\n            Var Name\n        \u003c/th\u003e\n        \u003cth\u003e\n            Type\n        \u003c/th\u003e\n        \u003cth\u003e\n            Start - End\n        \u003c/th\u003e\n        \u003cth\u003e\n            Escaped end\n        \u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDoubleQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\"\u003c/code\u003e \u003ccode\u003e\"\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDoubleQuotesBackSlashEscaped\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\"\u003c/code\u003e \u003ccode\u003e\"\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\\\"\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDoubleQuotesDoubleEscaped\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\"\u003c/code\u003e \u003ccode\u003e\"\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\"\"\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSingleQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e'\u003c/code\u003e \u003ccode\u003e'\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSingleQuotesBackSlashEscaped\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e'\u003c/code\u003e \u003ccode\u003e'\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\\'\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSingleQuotesDoubleEscaped\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e'\u003c/code\u003e \u003ccode\u003e'\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e''\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSingleInvertedQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e`\u003c/code\u003e \u003ccode\u003e`\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSingleInvertedQuotesBackSlashEscaped\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e`\u003c/code\u003e \u003ccode\u003e`\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\\'\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSingleInvertedQuotesDoubleEscaped\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e`\u003c/code\u003e \u003ccode\u003e`\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e``\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSinglePointingAngleQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2039;\u003c/code\u003e \u003ccode\u003e\u0026#x203A;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSinglePointingAngleQuotesBackSlashEscaped\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2039;\u003c/code\u003e \u003ccode\u003e\u0026#x203A;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\\\u0026#x203A;\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDoublePointingAngleQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x00AB;\u003c/code\u003e \u003ccode\u003e\u0026#x00BB;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLeftRightDoubleDoubleQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x201C;\u003c/code\u003e \u003ccode\u003e\u0026#x201D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLeftRightDoubleSingleQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2018;\u003c/code\u003e \u003ccode\u003e\u0026#x2019;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLeftRightDoublePrimeQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x301D;\u003c/code\u003e \u003ccode\u003e\u0026#x301E;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSingleLowHigh9Quotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x201A;\u003c/code\u003e \u003ccode\u003e\u0026#x201B;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDoubleLowHigh9Quotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x201E;\u003c/code\u003e \u003ccode\u003e\u0026#x201F;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e(\u003c/code\u003e \u003ccode\u003e)\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eCurlyBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e{\u003c/code\u003e \u003ccode\u003e}\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSquareBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e[\u003c/code\u003e \u003ccode\u003e]\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLtGtAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026lt;\u003c/code\u003e \u003ccode\u003e\u0026gt;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLeftRightPointingAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2329;\u003c/code\u003e \u003ccode\u003e\u0026#x232A;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSubscriptParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x208D;\u003c/code\u003e \u003ccode\u003e\u0026#x208E;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSuperscriptParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x207d;\u003c/code\u003e \u003ccode\u003e\u0026#x207e;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSmallParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFE59;\u003c/code\u003e \u003ccode\u003e\u0026#xFE5A;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSmallCurlyBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFE5B;\u003c/code\u003e \u003ccode\u003e\u0026#xFE5C;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDoubleParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E28;\u003c/code\u003e \u003ccode\u003e\u0026#x2E29;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMathWhiteSquareBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x27E6;\u003c/code\u003e \u003ccode\u003e\u0026#x27E7;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMathAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x27E8;\u003c/code\u003e \u003ccode\u003e\u0026#x27E9;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMathDoubleAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x27EA;\u003c/code\u003e \u003ccode\u003e\u0026#x27EB;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMathWhiteTortoiseShellBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x27EC;\u003c/code\u003e \u003ccode\u003e\u0026#x27ED;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMathFlattenedParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x27EE;\u003c/code\u003e \u003ccode\u003e\u0026#x27EF;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eOrnateParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFD3E;\u003c/code\u003e \u003ccode\u003e\u0026#xFD3F;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x3008;\u003c/code\u003e \u003ccode\u003e\u0026#x3009;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDoubleAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x300A;\u003c/code\u003e \u003ccode\u003e\u0026#x300B;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eFullWidthParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFF08;\u003c/code\u003e \u003ccode\u003e\u0026#xFF09;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eFullWidthSquareBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFF3B;\u003c/code\u003e \u003ccode\u003e\u0026#xFF3D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eFullWidthCurlyBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFF5B;\u003c/code\u003e \u003ccode\u003e\u0026#xFF5D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSubstitutionBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E02;\u003c/code\u003e \u003ccode\u003e\u0026#x2E03;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSubstitutionQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E02;\u003c/code\u003e \u003ccode\u003e\u0026#x2E03;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDottedSubstitutionBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E04;\u003c/code\u003e \u003ccode\u003e\u0026#x2E05;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eDottedSubstitutionQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E04;\u003c/code\u003e \u003ccode\u003e\u0026#x2E05;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eTranspositionBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E09;\u003c/code\u003e \u003ccode\u003e\u0026#x2E0A;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eTranspositionQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E09;\u003c/code\u003e \u003ccode\u003e\u0026#x2E0A;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eRaisedOmissionBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E0C;\u003c/code\u003e \u003ccode\u003e\u0026#x2E0D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eRaisedOmissionQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E0C;\u003c/code\u003e \u003ccode\u003e\u0026#x2E0D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLowParaphraseBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E1C;\u003c/code\u003e \u003ccode\u003e\u0026#x2E1D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLowParaphraseQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2E1C;\u003c/code\u003e \u003ccode\u003e\u0026#x2E1D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSquareWithQuillBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2045;\u003c/code\u003e \u003ccode\u003e\u0026#x2046;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eWhiteParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2985;\u003c/code\u003e \u003ccode\u003e\u0026#x2986;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eWhiteCurlyBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2983;\u003c/code\u003e \u003ccode\u003e\u0026#x2984;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eWhiteSquareBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x301A;\u003c/code\u003e \u003ccode\u003e\u0026#x301B;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eWhiteLenticularBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x3016;\u003c/code\u003e \u003ccode\u003e\u0026#x3017;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eWhiteTortoiseShellBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x3018;\u003c/code\u003e \u003ccode\u003e\u0026#x3019;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eFullWidthWhiteParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFF5F;\u003c/code\u003e \u003ccode\u003e\u0026#xFF60;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eBlackTortoiseShellBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2997;\u003c/code\u003e \u003ccode\u003e\u0026#x2998;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eBlackLenticularBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x3010;\u003c/code\u003e \u003ccode\u003e\u0026#x3011;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003ePointingCurvedAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x29FC;\u003c/code\u003e \u003ccode\u003e\u0026#x29FD;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eTortoiseShellBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x3014;\u003c/code\u003e \u003ccode\u003e\u0026#x3015;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eSmallTortoiseShellBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#xFE5D;\u003c/code\u003e \u003ccode\u003e\u0026#xFE5E;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eZNotationImageBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2987;\u003c/code\u003e \u003ccode\u003e\u0026#x2988;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eZNotationBindingBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2989;\u003c/code\u003e \u003ccode\u003e\u0026#x298A;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMediumOrnamentalParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2768;\u003c/code\u003e \u003ccode\u003e\u0026#x2769;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eLightOrnamentalTortoiseShellBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2772;\u003c/code\u003e \u003ccode\u003e\u0026#x2773;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMediumOrnamentalFlattenedParenthesis\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x276A;\u003c/code\u003e \u003ccode\u003e\u0026#x276B;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMediumOrnamentalPointingAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x276C;\u003c/code\u003e \u003ccode\u003e\u0026#x276D;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eMediumOrnamentalCurlyBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2774;\u003c/code\u003e \u003ccode\u003e\u0026#x2775;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eHeavyOrnamentalPointingAngleQuotes\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eQuote\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x276E;\u003c/code\u003e \u003ccode\u003e\u0026#x276F;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eHeavyOrnamentalPointingAngleBrackets\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003eBrackets\u003c/td\u003e\n        \u003ctd\u003e\u003ccode\u003e\u0026#x2770;\u003c/code\u003e \u003ccode\u003e\u0026#x2771;\u003c/code\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cem\u003enone\u003c/em\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n_Note: To convert any of the above enclosures to escaping - use the `MakeEscapable()` or `MustMakeEscapable()` functions._\n\n### Quote enclosures with escaping\nQuotes within quotes can be handled by using an enclosure that specifies how the escaping works, for example the following uses \\ (backslash) prefixed escaping...\n```go\npackage main\n\nimport \"github.com/go-andiamo/splitter\"\n\nfunc main() {\n    commaSplitter, _ := splitter.NewSplitter(',', splitter.DoubleQuotesBackSlashEscaped)\n\n    str := `\"aaa\",\"bbb\",\"this, for sanity, \\\"should\\\" not be split\"`\n    parts, _ := commaSplitter.Split(str)\n    println(len(parts))\n}\n```\n[try on go-playground](https://go.dev/play/p/wgJ68hXBp1n)\n\nOr with double escaping...\n```go\npackage main\n\nimport \"github.com/go-andiamo/splitter\"\n\nfunc main() {\n    commaSplitter, _ := splitter.NewSplitter(',', splitter.DoubleQuotesDoubleEscaped)\n\n    str := `\"aaa\",\"bbb\",\"this, for sanity, \"\"\"\"should,,,,\"\" not be split\"`\n    parts, _ := commaSplitter.Split(str)\n    println(len(parts))\n}\n```\n[try on go-playground](https://go.dev/play/p/3BpayDZyaA7)\n\n#### Not separating when separator encountered in quotes or brackets...\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/go-andiamo/splitter\"\n)\n\nfunc main() {\n    encs := []*splitter.Enclosure{\n        splitter.Parenthesis, splitter.SquareBrackets, splitter.CurlyBrackets,\n        splitter.DoubleQuotesDoubleEscaped, splitter.SingleQuotesDoubleEscaped,\n    }\n    commaSplitter, _ := splitter.NewSplitter(',', encs...)\n\n    str := `do(not,)split,'don''t,split,this',[,{,(a,\"this has \"\" quotes\")}]`\n    parts, _ := commaSplitter.Split(str)\n    println(len(parts))\n    for i, pt := range parts {\n        fmt.Printf(\"\\t[%d]%s\\n\", i, pt)\n    }\n}\n```\n[try on go-playground](https://go.dev/play/p/bvzC1NXfG3z)\n\n## Options\nOptions define behaviours that are to be carried out on each found part during splitting.\n\nAn option, by virtue of it's return args from `.Apply()`, can do one of three things:\n1. return a modified string of what is to be added to the split parts\n2. return a `false` to indicate that the split part is not to be added to the split result\n3. return an `error` to indicate that the split part is unacceptable (and cease further splitting - the error is returned from the `Split` method)\n\nOptions can be added directly to the Splitter using `.AddDefaultOptions()` method.  These options are checked for every call to the splitters `.Split()` method.\n\nOptions can also be specified when calling the splitter `.Split()` method - these options are only carried out for this call (and after any options already specified on the splitter)\n\n### Option Examples\n#### 1. Stripping empty parts\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/go-andiamo/splitter\"\n)\n\nfunc main() {\n    s := splitter.MustCreateSplitter('/').\n        AddDefaultOptions(splitter.IgnoreEmpties)\n\n    parts, _ := s.Split(`/a//c/`)\n    println(len(parts))\n    fmt.Printf(\"%+v\", parts)\n}\n```\n[try on go-playground](https://go.dev/play/p/l1YnMoeA9Jm)\n\n#### 2. Stripping empty first/last parts\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/go-andiamo/splitter\"\n)\n\nfunc main() {\n    s := splitter.MustCreateSplitter('/').\n        AddDefaultOptions(splitter.IgnoreEmptyFirst, splitter.IgnoreEmptyLast)\n\n    parts, _ := s.Split(`/a//c/`)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n\n    parts, _ = s.Split(`a//c/`)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n\n    parts, _ = s.Split(`/a//c`)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n}\n```\n[try on go-playground](https://go.dev/play/p/n1NEKQhtWsY)\n\n#### 3. Trimming parts\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/go-andiamo/splitter\"\n)\n\nfunc main() {\n    s := splitter.MustCreateSplitter('/').\n        AddDefaultOptions(splitter.TrimSpaces)\n\n    parts, _ := s.Split(`/a/b/c/`)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n\n    parts, _ = s.Split(`  / a /b / c/    `)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n\n    parts, _ = s.Split(`/   a   /   b   /   c   /`)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n}\n```\n[try on go-playground](https://go.dev/play/p/d8FZXJCBPze)\n\n#### 4. Trimming spaces (and removing empties)\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/go-andiamo/splitter\"\n)\n\nfunc main() {\n    s := splitter.MustCreateSplitter('/').\n        AddDefaultOptions(splitter.TrimSpaces, splitter.IgnoreEmpties)\n\n    parts, _ := s.Split(`/a/  /c/`)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n\n    parts, _ = s.Split(`  / a // c/    `)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n\n    parts, _ = s.Split(`/   a   /      /   c   /`)\n    println(len(parts))\n    fmt.Printf(\"%+v\\n\", parts)\n}\n```\n[try on go-playground](https://go.dev/play/p/S_ald78xtSi)\n\n#### 5. Error for empties found\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/go-andiamo/splitter\"\n)\n\nfunc main() {\n    s := splitter.MustCreateSplitter('/').\n        AddDefaultOptions(splitter.TrimSpaces, splitter.NoEmpties)\n\n    if parts, err := s.Split(`/a/  /c/`); err != nil {\n        println(err.Error())\n    } else {\n        println(len(parts))\n        fmt.Printf(\"%+v\\n\", parts)\n    }\n\n    if parts, err := s.Split(`  / a // c/    `); err != nil {\n        println(err.Error())\n    } else {\n        println(len(parts))\n        fmt.Printf(\"%+v\\n\", parts)\n    }\n\n    if parts, err := s.Split(`/   a   /      /   c   /`); err != nil {\n        println(err.Error())\n    } else {\n        println(len(parts))\n        fmt.Printf(\"%+v\\n\", parts)\n    }\n\n    if parts, err := s.Split(` a / b/c `); err != nil {\n        println(err.Error())\n    } else {\n        println(len(parts))\n        fmt.Printf(\"%+v\\n\", parts)\n    }\n}\n```\n[try on go-playground](https://go.dev/play/p/LVLkuRMoYJX)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgo-andiamo%2Fsplitter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgo-andiamo%2Fsplitter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgo-andiamo%2Fsplitter/lists"}