如何使用自定义词边界创建将获取 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:感谢您的所有评论。
要明确:
- 我想设置作为单词分隔符的字符
- 我们称其为 "Delimiter Set" 或 strDelimiters
strDelimiters = ".,;:!?-*_"
nNumWordsToFind = 5
- 单词定义为不包含 strDelimiters 中任何字符的任何连续文本
- RegEx 字边界是包含 strDelimiters 中的一个或多个字符的任何连续文本
- 我想使用 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.
- 匹配第一个单词前任意数量的定界符
- 匹配一个词(=至少一个非定界符)
- 单词后必须至少跟一个分隔符
- 也可以在字符串的末尾(如果末尾没有分隔符)
- 重复 2. 到 4.
次
注意我是如何改变-
的顺序的,它必须在开头或结尾,否则需要转义:\-
.
感谢@maraca 为我的问题提供完整的答案。
我只是想 post 我使用 @maraca 的 RegEx 模式为对完整解决方案感兴趣的任何人构建的 Keyboard Maestro 宏。
查看 KM 论坛宏:Get a Max of N Words in String Using RegEx
我需要一个 RegEx 模式,它将 return 前 N 个词使用自定义词边界,即正常的 RegEx 白色 space (\s) 加上标点符号,如 .,;:!?-*_
编辑 #1:感谢您的所有评论。
要明确:
- 我想设置作为单词分隔符的字符
- 我们称其为 "Delimiter Set" 或 strDelimiters
strDelimiters = ".,;:!?-*_"
nNumWordsToFind = 5
- 单词定义为不包含 strDelimiters 中任何字符的任何连续文本
- RegEx 字边界是包含 strDelimiters 中的一个或多个字符的任何连续文本
- 我想使用 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.
- 匹配第一个单词前任意数量的定界符
- 匹配一个词(=至少一个非定界符)
- 单词后必须至少跟一个分隔符
- 也可以在字符串的末尾(如果末尾没有分隔符)
- 重复 2. 到 4.
次
注意我是如何改变-
的顺序的,它必须在开头或结尾,否则需要转义:\-
.
感谢@maraca 为我的问题提供完整的答案。
我只是想 post 我使用 @maraca 的 RegEx 模式为对完整解决方案感兴趣的任何人构建的 Keyboard Maestro 宏。