Как выделить все слова в тексте с более чем 1 заглавными буквами? Мне удалось выделить определенное слово с помощью этой строки:
(?<![a-z])word(?![a-z])
Но я не уверен, как выбрать такие слова, как SElect, SeLeCt, SelecT, seleCT, selEcT.
Я думаю, что вам нужно /(?<![A-Za-z])(?:[a-z]*[A-Z]){2}[A-Za-z]*(?![A-Za-z])/g, то есть буквенное слово между небуквенными символами, состоящее как минимум из двух заглавных букв.
@WiktorStribiżew Спасибо. Это ответ.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать шаблон, чтобы утверждать, что справа находится «слово» и сопоставлять 2 символа в верхнем регистре, окруженные необязательными символами в верхнем и нижнем регистре.
(?<![a-zA-Z])[a-z]*[A-Z][a-z]*[A-Z][A-Za-z]*(?![a-zA-Z])
Объяснение
(?<![a-zA-Z]) Утверждать не a-zA-Z слева[a-z]*[A-Z] Сопоставьте необязательные символы az, за которыми следует AZ, чтобы соответствовать первому символу в верхнем регистре.[a-z]*[A-Z] Снова сопоставьте необязательные символы az, за которыми следует AZ, чтобы соответствовать второму символу в верхнем регистре.[a-zA-Z]* Сопоставьте необязательные символы a-zA-Z(?![a-zA-Z]) Утверждение не a-zA-Z справаДемонстрация регулярных выражений
@Neret Все такие слова? (?<![a-z])[a-zA-Z]*[A-Z][a-zA-Z]*[A-Z][a-zA-Z]*(?![a-z])regex101.com/r/bVIsd7/1
Да, все такие слова. Но границы должны быть [a-zA-Z], а не \b.
@Neret (?<![a-zA-Z])[a-zA-Z]*[A-Z][a-zA-Z]*[A-Z][a-zA-Z]*(?![a-zA-Z])regex101.com/r/sNdVBg/1
Да спасибо. Это ответ. Не могли бы вы немного объяснить, как это работает?
Можно ли утверждать хотя бы одну строчную букву в выборе?
Вы - гений! Большое спасибо.
const regex = /([a-z]*[A-Z]|[A-Z][a-z]*){2,}\b/g
const str = "SEEEEect, SeLeCt, SelecT, seleCT, selEcT select, seleCT, selEcT select, donselect"
const match = str.match(regex)
console.info(match)Позвольте мне также предложить полностью регулярное выражение Unicode:
/(?<!\p{L})(?:\p{Ll}*\p{Lu}){2}\p{L}*(?!\p{L})/gu
Смотрите доказательство.
Объяснение:
--------------------------------------------------------------------------------
(?<! look behind to see if there is not:
--------------------------------------------------------------------------------
\p{L} any Unicode letter
--------------------------------------------------------------------------------
) end of look-behind
--------------------------------------------------------------------------------
(?: group, but do not capture (2 times):
--------------------------------------------------------------------------------
\p{Ll}* any lowercase Unicode letter (0 or more
times (matching the most amount possible))
--------------------------------------------------------------------------------
\p{Lu} any uppercase Unicode letter
--------------------------------------------------------------------------------
){2} end of grouping
--------------------------------------------------------------------------------
\p{L}* any Unicode letter (0 or more
times (matching the most amount possible))
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
\p{L} any Unicode letter
--------------------------------------------------------------------------------
) end of look-ahead
JavaScript:
const regex = /(?<!\p{L})(?:\p{Ll}*\p{Lu}){2}\p{L}*(?!\p{L})/gu;
const string = "SEEEEect, SeLeCt, SelecT, seleCT, selEcT select, seleCT, selEcT select, donselect";
console.info(string.match(regex));
Сопоставляете ли вы определенное слово с переменным регистром или любую строку символов, содержащую хотя бы одну заглавную букву? Если это последнее, что-то вроде этого будет работать?
^([a-z]*[A-Z]+[a-zA-Z]*)$