I am struggling with a regular expression for detecting if a special character (hashtag #) is included exactly once in a string. Everything before and after the hashtag is unknown and can be any symbol (including whitespace and special characters).
Examples:
#
matches
##
doesnt match
a12bc#1def65
matches
a12bc##1def65
doesnt match
a234341#1212
matches
a23$. 4341#1 ._21&2
matches
#a23$. 4341#1 ._21&2#
doesnt match
I think that would be quiet simple (I am not really good in regex) so I tried
#{1}
Surprisingly this does not work as I expected. This regex matches also the string ##
.
Then I tried some stuff like #{1}\b
and (#{1}\b|[^#{2}])
. But everytime either the string #
dont match or ##
do match the regex.
CodePudding user response:
This pattern #{1}\b
can be written as #\b
and matches #
only if followed by a word boundary. This does not take a number of occurrences into account for a whole line.
This pattern (#{1}\b|[^#{2}])
has the same as before, followed by an alternation |
and negated character class [^#{2}]
that can match a single char other than chars #
{
2
}
If you don't want to match newlines, and match the whole string:
^[^\r\n#]*#[^\r\n#]*$
^
Start of string[^\r\n#]*
Optionally match any char except a newline or#
#
Match the#
char[^\r\n#]*
Optionally match any char except a newline or#
$
End of string