strings.FindRESubmatch

strings.FindRESubmatch


Returns a slice of all successive matches of the regular expression. Each element is a slice of strings holding the text of the leftmost match of the regular expression and the matches, if any, of its subexpressions.

By default, findRESubmatch finds all matches. You can limit the number of matches with an optional LIMIT argument. A return value of nil indicates no match.

Demonstrative examples #

{{ findRESubmatch `a(x*)b` "-ab-" }} → [["ab" ""]]
{{ findRESubmatch `a(x*)b` "-axxb-" }} → [["axxb" "xx"]]
{{ findRESubmatch `a(x*)b` "-ab-axb-" }} → [["ab" ""] ["axb" "x"]]
{{ findRESubmatch `a(x*)b` "-axxb-ab-" }} → [["axxb" "xx"] ["ab" ""]]
{{ findRESubmatch `a(x*)b` "-axxb-ab-" 1 }} → [["axxb" "xx"]]

Practical example #

This Markdown:

- [Example](https://example.org)
- [Hugo](https://gohugo.io)

Produces this HTML:

<ul>
  <li><a href="https://example.org">Example</a></li>
  <li><a href="https://gohugo.io">Hugo</a></li>
</ul>

To match the anchor elements, capturing the link destination and text:

{{ $regex := `<a\s*href="(.+?)">(.+?)</a>` }}
{{ $matches := findRESubmatch $regex .Content }}

Viewed as JSON, the data structure of $matches in the code above is:

[
  [
    "<a href=\"https://example.org\"></a>Example</a>",
    "https://example.org",
    "Example"
  ],
  [
    "<a href=\"https://gohugo.io\">Hugo</a>",
    "https://gohugo.io",
    "Hugo"
  ]
]

To render the href attributes:

{{ range $matches }}
  {{ index . 1 }}
{{ end }}

Result:

https://example.org
https://gohugo.io