Как я могу создать шаблон регулярного выражения, который будет получать N слов, используя пользовательскую границу слова?

Мне нужен шаблон RegEx, который вернет первые N слов, используя пользовательскую границу слова, которая представляет собой обычный пробел RegEx (\s) плюс знаки препинания, такие как .,;:!?-*_

РЕДАКТИРОВАТЬ № 1: Спасибо за все ваши комментарии.

Чтобы было ясно:

  1. Я хотел бы установить символы, которые будут разделителями слов
  2. Назовем это «Набор разделителей» или strDelimiters.
  3. strDelimiters = ".,;:!?-*_"
  4. nNumWordsToFind = 5
  5. Слово определяется как любой непрерывный текст, который НЕ содержит ни одного символа в strDelimiters.
  6. Граница слова RegEx — это любой непрерывный текст, который содержит один или несколько символов из strDelimiters.
  7. Я хотел бы создать шаблон RegEx для получения/возврата первого nNumWordsToFind с использованием strDelimiters.

РЕДАКТИРОВАТЬ № 2: сб, 8 августа 2015 г., 00:49, США, Коннектикут.

@maraca определенно ответил на мой вопрос, как было сказано изначально. Но на самом деле мне нужно вернуть количество слов ≤ nNumWordsToFind. Поэтому, если в исходном тексте всего 3 слова, а мое регулярное выражение запрашивает 4 слова, мне нужно, чтобы оно вернуло 3 слова. Ответ, предоставленный маракой, не работает, если nNumWordsToFind > количество фактических слов в исходном тексте.

Например:

one,two;three-four_five.six:seven eight    nine! ten

Он увидит это как 10 слов. Если мне нужны первые 5 слов, он вернет:

one,two;three-four_five.

У меня есть этот шаблон с использованием обычного пробела \s, который работает, но НЕ совсем то, что мне нужно:

([\w]+\s+){<NumWordsOut>}

где <NumWordsOut> — количество возвращаемых слов.

Я также нашел этот шаблон границы слова, но я не знаю, как его использовать:

«граница реального слова», которая определяет границу между буквой ASCII и не буквой.

(?i)(?<=^|[^a-z])(?=[a-z])|(?<=[a-z])(?=$|[^a-z])

Тем не менее, я хотел бы, чтобы мои слова допускали и цифры.

IAC, я не смог использовать приведенный выше пользовательский шаблон границы слова, чтобы вернуть первые N слов моего текста.

Кстати, я буду использовать это в макросе Keyboard Maestro.

Кто-нибудь может помочь? ТИА.


person JMichaelTX    schedule 08.08.2015    source источник
comment
Все это будет зависеть от языка регулярных выражений.   -  person Anonymous    schedule 08.08.2015
comment
Кроме того, когда вы говорите плюс знаки препинания, такие как .,;:!?-*_. Вы имеете в виду точно эти символы или похожие символы. В последнем случае вы должны указать точно, какие символы вы собираетесь использовать в качестве разделителей.   -  person Anonymous    schedule 08.08.2015
comment
Вы также должны точно определить, какие символы квалифицируются как словесные символы. В общем, будьте как можно более конкретными.   -  person Anonymous    schedule 08.08.2015
comment
Спасибо за все ваши комментарии и предложения. Я обновил свой исходный пост, чтобы предоставить запрошенную вами конкретику.   -  person JMichaelTX    schedule 08.08.2015
comment
Гораздо лучше, но было бы полезно, если бы вы также могли указать, какой язык регулярных выражений вы используете.   -  person Anonymous    schedule 08.08.2015


Ответы (2)


Все, что вам нужно сделать, это адаптировать шаблон ([\w]+\s+){<NumWordsOut>}, включая некоторые особые случаи:

^[\s.,;:!?*_-]*([^\s.,;:!?*_-]+([\s.,;:!?*_-]+|$)){<NumWordsOut>}
1.             2.              3.             4.  5.
  1. Совпадение с любым количеством разделителей перед первым словом
  2. Совпадение со словом (= хотя бы один не разделитель)
  3. За словом должен следовать хотя бы один разделитель
  4. Или он может быть в конце строки (если в конце не следует разделитель)
  5. Повторить со 2-го по 4-й раз ‹NumWordsOut› раз.

Обратите внимание, как я изменил порядок -, он должен быть в начале или в конце, иначе его нужно экранировать: \-.

person maraca    schedule 08.08.2015
comment
ОТЛИЧНЫЙ ответ! Это определенно отвечает на мой вопрос. ???? Можно вопрос вдогонку? Как я могу вернуть количество слов ≤ NumWordsOut ? Если в моем исходном тексте всего 3 слова, а регулярное выражение запрашивает 4, то оно терпит неудачу и ничего не возвращает. Я хочу, чтобы он возвращал столько слов, сколько он найдет, но не больше, чем NumWordsOut. Как я могу это сделать? - person JMichaelTX; 08.08.2015
comment
@JMichaelTX, вы можете использовать {0,<numWordsOut>} только для ограничения верхней границы и принятия меньшего количества слов. Иногда {,<numWordsOut>} тоже работает. - person maraca; 08.08.2015
comment
Спасибо @maraca! Это работает как шарм! Идеально! ???? Проблема полностью решена! - person JMichaelTX; 09.08.2015

Спасибо @maraca за полный ответ на мой вопрос.

Я просто хотел опубликовать макрос Keyboard Maestro, который я создал с использованием шаблона RegEx @maraca, для всех, кто интересуется полным решением.

См. макрос форума KM: Получить макс. N слов в строке с использованием RegEx

person JMichaelTX    schedule 09.08.2015