alexander farkas alexander farkas - 7 months ago 11
Javascript Question

Match any character after a dot until either next dot or end of line

As my question I want to match

foo
out of
asa .foo. assas
and in case of
bar .foo
.

While I know how to do one of these ending conditions, I don't know how to combine them.

My current work looks something like this:

/\.(.+?)(?=[\.|\Z])/g

Answer

I would suggest the following:

\.(\S*)(?=\.|$)

How it works:

\.    # . (Dot)
(     # Capture Data (foo)
  \S    # Any Non-Whitespace Character
  *     # 0 or more times
)
(?=   # Lookahead (Check) for...
  \.    # . (Dot)
  |     # OR
  $     # End of String
)

The data you want is stored in the 1st Capture Group

Live Demo on Regex101


Problems with your RegEx:

\.(.+?)(?=[\.|\Z])
  • The \. is fine
  • .+? makes no sense.
    • + means 1 or more times, whereas * means 0 or more times. So I can see what you were trying to get at, but it is simpler to just use (.*)
  • [\.|\Z] will not work as you expected.
    • First, no need to escape the \., just use .. Next, any character inside [] will be matched. This means it will match ., | or \Z. You only use | when inside a Group, like \.|\Z. Finally, you can use $ instead of \Z
    • This means can (?=\.|$) or (?=[.\Z]) (\Z needs to be used here because $ matches a $ literally)