3

通常の RegEx 空白 (\s) と次のような句読点であるカスタム単語境界を使用して最初の N 単語を返す RegEx パターンが必要です.,;:!?-*_

編集 #1: コメントありがとうございます。

明確にするために:

  1. 単語の区切りとなる文字を設定したい
  2. これを「区切り文字セット」または strDelimiters と呼びましょう
  3. strDelimiters = ".,;:!?-*_"
  4. nNumWordsToFind = 5
  5. 単語は、strDelimiters に文字を含まない連続したテキストとして定義されます
  6. 正規表現の単語境界は、strDelimiters 内の 1 つ以上の文字を含む連続したテキストです。
  7. strDelimiters を使用して最初の nNumWordsToFind を取得/返す RegEx パターンを構築したいと思います。

編集 #2: 2015 年 8 月 8 日土曜日午前 12:49 US CT

@maraca は、最初に述べたように私の質問に確実に答えました。しかし、実際に必要なのは、単語数 ≤ nNumWordsToFind を返すことです。したがって、ソース テキストに 3 単語しかないのに、正規表現が 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マクロで使用します。

誰でも助けることができますか?ティア。

4

2 に答える 2

1

あなたがしなければならないことは([\w]+\s+){<NumWordsOut>}、いくつかの特殊なケースを含め、パターンを適応させることだけです:

^[\s.,;:!?*_-]*([^\s.,;:!?*_-]+([\s.,;:!?*_-]+|$)){<NumWordsOut>}
1.             2.              3.             4.  5.
  1. 最初の単語の前に任意の数の区切り文字を一致させる
  2. 単語に一致 (= 少なくとも 1 つの非区切り文字)
  3. 単語の後には少なくとも 1 つの区切り文字が必要です
  4. または、文字列の末尾にすることもできます (末尾に区切り文字がない場合)。
  5. 2.~4.<NumWordsOut>回繰り返す

の順序をどのように変更したかに注意してください-。最初または最後にある必要があります。そうでない場合は、エスケープする必要があります\-

于 2015-08-08T03:08:26.463 に答える
0

私の質問に対する完全な回答を提供してくれた @maraca に感謝します。

@maraca の RegEx パターンを使用して作成した Keyboard Maestro マクロを、完全なソリューションに関心のある人のために投稿したかっただけです。

KM Forum Macro: Get a Max of N words in String Using RegEx を参照してください。

于 2015-08-09T00:29:28.393 に答える