3

我需要一个正则表达式模式,它将使用自定义单词边界返回前 N 个单词,该边界是正常的正则表达式空格 (\s) 加上标点符号.,;:!?-*_

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

要清楚:

  1. 我想设置作为单词分隔符的字符
  2. 让我们称之为“分隔符集”或 strDelimiters
  3. strDelimiters = ".,;:!?-*_"
  4. nNumWordsToFind = 5
  5. 单词被定义为不包含 strDelimiters 中任何字符的任何连续文本
  6. RegEx 单词边界是包含 strDelimiters 中的一个或多个字符的任何连续文本
  7. 我想构建 RegEx 模式以使用 strDelimiters 获取/返回第一个 nNumWordsToFind。

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

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

例如:

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宏中使用它。

任何人都可以帮忙吗?TIA。

4

2 回答 2

1

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

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

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

于 2015-08-08T03:08:26.463 回答
0

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

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

请参阅 KM 论坛宏:使用 RegEx 在字符串中获取最多 N 个单词

于 2015-08-09T00:29:28.393 回答