$re = '/^.*?\K(?<![\w-])[A-Z]+-\d+/m';
$str = 'ABCD-1231 dummy title XYZ-566 (#423)
=> ABCD-1231
[ABCD-1232, XYZ-566] dummy title (#424)
=> ABCD-1232
[ABCD-1233] dummy title (#425)
=> ABCD-1233
ABCD-1234: dummy title (#426)
=> ABCD-1234
XYZ-567 dummy title (#427)
=> XYZ-567
(XYZ-568) dummy title (#428)
=> XYZ-568
"XYZ-569" dummy title (#429)
=> XYZ-569
dummy title XYZ-570 dummy title (#430)
=> XYZ-570
DUMMY title XYZ-571 dummy title (#431)
=> XYZ-571
\'feature/XYZ-572\' dummy title (#432)
=> XYZ-572
FEATURE|XYZ-573 dummy title (#433)
=> XYZ-573
<Feature\\XYZ-574> dummy title (#434)
=> XYZ-574
dummy title FAKE-XYZ-575 dummy title (#435)
=> <nothing>
dummy title abcdXYZ-576 dummy title (#436)
=> <nothing>
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php