You can use
grep -oE '[[:alpha:]]+-[0-9]+' file
The o option makes grep output matches only, E enables the POSIX ERE syntax (no need to escape +), and [[:alpha:]]+-[0-9]+ matches all substrings that start with one or more letters, then have a - char and then have one or more digits.
Alternatives
The above solution extracts all, multiple matches even if they occur on the same line in the file. If you do not want this behavior, and only want to match the <letters>-<digits> at the end of lines, you should simply add $ at the end of the regex pattern and use
grep -oE '[[:alpha:]]+-[0-9]+$' file`
If you need to extract the last occurrence on each line that is not necessarily at the end of a line, use a PCRE based regex with GNU grep or pcregrep (in case you installed it, a common workaround tool with non-GNU grep versions):
grep -oP '^(?:.*\P{L})?\K\p{L}+-\d+' file
pcregrep -o '^(?:.*\P{L})?\K\p{L}+-\d+' file
See this regex demo. In a PCRE pattern, \p{L} matches any letter (you may still use [[:alpha:]], too) and \d matches any ASCII digit, ^(?:.*\P{L})?\K matches start of string (^), and then an optional sequence of any zero or more chars other than line break chars, as many as possible (.*) and then any char other than a letter (\P{L}), this part makes the engine go to the last match occurrence of \p{L}+-\d+.
See the main solution online demo:
s='BUG-KEYWORD-BUG-101
ABC-10
DEF-10327
Output is referred in ABC-1043
Please refer DEF-11234'
grep -oE '[[:alpha:]]+-[0-9]+' <<< "$s"
Output:
BUG-101
ABC-10
DEF-10327
ABC-1043
DEF-11234