Reputation: 2112
I've a regex
(\/)?([\s\S]+)(?:@bigletterbot)?
When I match : /random@bigletterbot
Expected Output:
["/random@bigletterbot","/","random"]
However it is giving
["/random@bigletterbot","/","random@bigletterbot"]
Moreover when I match
Hello
World!
it is giving desired output. I tested at regex101.
Please tell me what I'm doing wrong.
Requirements:
/
is optional and if present should be captured,
[\s\S]+
is meant to be captured:
which can be:
Hello
World
or
Hello @ World
I thinks @ is making it difficult otherwise[^@]+
should work
and third part is a optional string @bigletterbot
which should not be captured
Upvotes: 2
Views: 130
Reputation: 626802
The regex you may use to match and capture an optional /
followed with any characters but a @
or @
symbols that are not followed with a word character is
(\/)?([^@]*(?:@\B[^@]*)*)
See the regex demo
The part I add is [^@]*(?:@\B[^@]*)*
:
[^@]*
- 0+ characters other than @
(?:@\B[^@]*)*
- 0+ sequences of:
@\B
- @
that is not followed with a word character (as \B
is a non-word boundary)[^@]*
- 0+ characters other than @
When a substring is not to be "matched" (you say @something
should not be captured, but actually mean it should not be matched), it means you need to match up to that substring. Thus, a negated character class solution is the best here, but it is complicated a little because you want to allow @
+ non-word characters combinations. The \B
should cope with those situations as user names should conform to the @\w+
pattern (so, all the @mentions will be safely stopped from matching with @\B
).
Upvotes: 1