Let's rewrite your regular expression with the (?x) flag and comment it shall we?
That gives us
\.? # Match the first instance of 0 or 1 one periods
( # then capture
\S+ # one or more non whitespace characters
So, if we follow that recipe on the string human.NT_113898
, the matcher looks at the start of the string, sees that the test for 0 or 1 periods
succeeds there, so it scarfs up the rest of the string into $1
. Which isn't what you wanted.
What you actually
want depends a little on what you're expecting as input. Assuming that there's always going to be at least one period in the input string, something like
\. # Find a full stop
(.*) # and capture everything after it
will do. However, f there's the possibility of there not being a period, you might have to do
^ # From the beginning
(?: # In a group...
[^.]* # Match any character except period, any number of times
\. # followed by a period
)? # math the group 0 or 1 times
(.*) # then capture everything else
If there's a trick to understanding why a regular expression doesn't do what you want, it's to break it down like this and go through each subexpression and explain to yourself what it's trying to match. Most of the time this narrative approach will lead you to your bug and to its fix remarkably quickly.