2016-07-04 1 views
-1

Я пытался сделать это навсегда. Я могу сопоставить первую букву каждого слова, но я не могу исключить слова, которые находятся в фигурных скобках.Как я могу сопоставить первую букву каждого слова, кроме слов в фигурных скобках с помощью Regex

Например:

Я не могу (делать) это, пожалуйста (помощь) мне.

Так что это должно соответствовать - I, c, t, p, m - только.

Использование \b\w соответствует только первым буквам слова, это не исключает слов в фигурных скобках. Я попытался также негативный предпросмотр, но кажется, что я не могу сделать это правильно:

(?!\(()\))\b\w 

Также у меня есть проблемы с юникодами. Использование (?:^|)[a-z]{1} или \b\w соответствует только латинские буквы, и я иногда имеют разные юникоды, например:

Я (кто-то) ვიღაც.

И в этой ситуации регулярное выражение будет соответствовать только I, a и s, не . Благодаря

+4

Попробуйте: «Я не могу этого сделать, просьбы e (help) me ".match (/ (?:^|) [A-Z] {1}/г) '. Не проверено. – ftor

+1

Обратите внимание: чтобы избежать пустых голосов, покажите, что вы пробовали до сих пор – ftor

+0

Спасибо! Он работает, но также соответствует пробелам перед буквами. «I», «c», «t», «p» ... – Messing

ответ

1

это один улов только первая буква слова:

(< = [^ (]) \ ч \ б

это положительный просмотра назад (от https://regex101.com/)

Гарантирует, что данная модель будет соответствовать, заканчиваясь в текущей позиции в выражении. не употреблять никаких символов.

/(? < = Foo) бар/

Foobar матч foobaz не совпадает

Для не-латинского алфавита я не могу вам помочь

+0

Спасибо за ответ, положительный lookbehind не поддерживается в javascript. Я забыл упомянуть о js в OP, но этот вопрос отмечен javascript. – Messing

2

различных вещей, чтобы рассмотреть.

  1. Прежде всего вам необходимо определить свои буквы, которые также могут быть не латинскими. See this answer and comments. Итак, чтобы сопоставить письмо, давайте использовать [\u00C0-\u1FFF\u2C00-\uD7FF\w]

  2. Как вы хотите сделать это в Javascript, регулярное выражение ограничено. Нельзя использовать границу слова \b, так как она не соответствует указанному диапазону букв. Lookbehind недоступен. Нам нужно использовать negated class указанной буквы. Что-то вроде (?:^|[^'\u00C0-\u1FFF\u2C00-\uD7FF\w-]) как «граница слова».Здесь я также добавил ', чтобы избежать матчей, таких как can't

  3. Использовать lookahead для проверки, чтобы быть вне скобок: (?![^(]*\))

Все вместе картина будет выглядеть

(?:^|[^'\u00C0-\u1FFF\u2C00-\uD7FF\w])([\u00C0-\u1FFF\u2C00-\uD7FF\w])(?![^(]*\)) 

See this fiddle и demo at regex101

+0

Отличный трюк 'RegExp'! Не очень надежный, хотя. Вероятно, слишком много исключений: «Кодовый текст» .match (/ (?:^| [^ 'Az \ w]) ([az \ w]) (?! [^ (] * \))/Gi) ' – ftor

+0

@ LUH3417 благодарим вас за комментарий (: вы имеете в виду из-за' -'? [Он может быть изменен для нужд] (https://regex101.com/r/eJ5nE8/2). –

Смежные вопросы