In JavaScript regex, you must always escape the ]
inside a character class:
[([^]s]+).([^]]+)]
See the regex demo
JS parsed [^]
as *any character including a newline in your regex, and the final character class ]
symbol as a literal ]
.
In this regard, JS regex engine deviates from the POSIX standard where smart placement is used to match [
and ]
symbols with bracketed expressions like [^][]
.
The ]
character is treated as a literal character if it is the first character after ^
: [^]abc]
.
In JS and Ruby, that is not working like that:
You can include an unescaped closing bracket by placing it right after the opening bracket, or right after the negating caret. []x]
matches a closing bracket or an x
. [^]x]
matches any character that is not a closing bracket or an x
. This does not work in JavaScript, which treats []
as an empty character class that always fails to match, and [^]
as a negated empty character class that matches any single character. Ruby treats empty character classes as an error. So both JavaScript and Ruby require closing brackets to be escaped with a backslash to include them as literals in a character class.
Related:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…