如何使用自定义词边界创建将获取 N 个词的 RegEx 模式?

How Can I Create a RegEx Pattern that will Get N Words Using Custom Word Boundary?

我需要一个 RegEx 模式,它将 return 前 N 个词使用自定义词边界,即正常的 RegEx 白色 space (\s) 加上标点符号,如 .,;:!?-*_

编辑 #1:感谢您的所有评论。

要明确:

  1. 我想设置作为单词分隔符的字符
  2. 我们称其为 "Delimiter Set" 或 strDelimiters
  3. strDelimiters = ".,;:!?-*_"
  4. nNumWordsToFind = 5
  5. 单词定义为不包含 strDelimiters 中任何字符的任何连续文本
  6. RegEx 字边界是包含 strDelimiters 中的一个或多个字符的任何连续文本
  7. 我想使用 strDelimiters 将 RegEx 模式构建到 get/return 第一个 nNumWordsToFind。

编辑 #2:2015 年 8 月 8 日,星期六,美国 CT 12:49 上午

@maraca 确实如最初所述回答了我的问题。 但我实际需要的是return字数≤nNumWordsToFind。 因此,如果源文本只有 3 个词,但我的 RegEx 要求 4 个词,我需要它 return 这 3 个词。如果 nNumWordsToFind > 源文本中的实际单词数,则 maraca 提供的答案将失败。

例如:

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

它会将此视为 10 个字。 如果我想要前 5 个单词,它将 return:

one,two;three-four_five.

我有这个图案,使用的是普通的 \s 白色space,效果很好,但不完全是我需要的:

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

其中 <NumWordsOut> 是 return 的字数。

我也找到了这个词界模式,但是不知道怎么用:

a "real word boundary" that detects the edge between an ASCII letter and a non-letter.

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

但是,我希望我的话也允许数字。

IAC,我无法使用上述自定义单词边界模式来 return 我文本的前 N ​​个单词。

顺便说一句,我将在 Keyboard Maestro 宏中使用它。

有人可以帮忙吗? TIA.

你所要做的就是调整你的模式([\w]+\s+){<NumWordsOut>},包括一些特殊情况:

^[\s.,;:!?*_-]*([^\s.,;:!?*_-]+([\s.,;:!?*_-]+|$)){<NumWordsOut>}
1.             2.              3.             4.  5.
  1. 匹配第一个单词前任意数量的定界符
  2. 匹配一个词(=至少一个非定界符)
  3. 单词后必须至少跟一个分隔符
  4. 也可以在字符串的末尾(如果末尾没有分隔符)
  5. 重复 2. 到 4.

注意我是如何改变-的顺序的,它必须在开头或结尾,否则需要转义:\-.

感谢@maraca 为我的问题提供完整的答案。

我只是想 post 我使用 @maraca 的 RegEx 模式为对完整解决方案感兴趣的任何人构建的 Keyboard Maestro 宏。

查看 KM 论坛宏:Get a Max of N Words in String Using RegEx