Ваше собственное регулярное выражение \b([a-zA-Z0-9_-]){3,16}\b
достаточно для того, чтобы дать намеченное совпадение, но \b
не сможет выполнить свою работу и позволит частично сопоставить слово, такое как @smith
, чтобы дать вам smith
, поскольку @
не соответствует часть символа слова и, следовательно, s
в smith
будет совпадать, поскольку точка между @
и s
действительно является границей слова. Вам понадобится другое регулярное выражение, обеспечивающее, чтобы за словом предшествовал / следовал пробел, а также запятая, за некоторыми словами следуют запятые, и вы хотите их подсчитать. Попробуйте использовать это регулярное выражение,
(?<= |^)[a-zA-Z0-9_-]{3,16}(?=[ ,]|$)
Демо
Это должно дать вам совпадения только с теми словами, которые соответствуют вашим правилам.
Примечание: всегда держите -
либо в самом начале, либо в самом конце, когда он находится в наборе символов, в противном случае он иногда ведет себя странно и дает неожиданные результаты.