I have the following situation, I'm searching in a HTML string for the attributes.
I have the following regex which works alright, but I want to get just unique results, of course I can apply some filter to the results array but I think this is achievable with pure regex.
So in this situation class is returned twice, but I only want 1 time:
['class', 'data-text']
not ['class', 'data-text', 'class']
const html = `<div class="foo">
<span data-text="Some string" class="bar"></span>
</div>`
console.log(html.match(/[\w-:]+(?=\s*=\s*".*?")/g))
I have the following situation, I'm searching in a HTML string for the attributes.
I have the following regex which works alright, but I want to get just unique results, of course I can apply some filter to the results array but I think this is achievable with pure regex.
https://regex101./r/UqCuJS/1
So in this situation class is returned twice, but I only want 1 time:
['class', 'data-text']
not ['class', 'data-text', 'class']
const html = `<div class="foo">
<span data-text="Some string" class="bar"></span>
</div>`
console.log(html.match(/[\w-:]+(?=\s*=\s*".*?")/g))
http://jsbin./bekibanisa/edit?js,console
Share Improve this question edited Dec 31, 2023 at 18:28 Jason Aller 3,65228 gold badges41 silver badges39 bronze badges asked Apr 30, 2017 at 15:12 AndersonAnderson 3411 gold badge5 silver badges18 bronze badges 6-
Can you include full
javascript
tried at Question? Are you using.split()
or.match()
to get array of matches? – guest271314 Commented Apr 30, 2017 at 15:15 - jsbin./bekibanisa/edit?js,console check this out, .match – Anderson Commented Apr 30, 2017 at 15:16
- 2 See jsbin./yofozabilu/1/edit?js,console – Wiktor Stribiżew Commented Apr 30, 2017 at 15:19
- @WiktorStribiżew your answer seems right, can you post it with an explanation of what is happening? – Anderson Commented Apr 30, 2017 at 15:21
-
1
Yes, the greedy patterns with a construct matching any char, any number of times, will cause much backtracking. Use
/[\w-:]+(?=\s*=\s*"[^"]*")/g
and use.filter()
. – Wiktor Stribiżew Commented Apr 30, 2017 at 15:49
2 Answers
Reset to default 10You can pass result of .match()
to Set
, which does not allow duplicate values. If necessary convert Set
instance back to Array
.
const html = `<div class="foo">
<span data-text="Some string" class="bar"></span>
</div>`
// or use existing `RegExp`
console.log([...new Set(html.match(/([\w-]+)(?=[=]")/g))])
Try removing the '/g' global modifier
console.log(html.match(/[\w-:]+(?=\s*=\s*".*?")/))