3

私は ColdFusion 10 を使用しています。正規表現を使用する必要はほとんどないので、本当に助けが必要です。

長いコンテンツ (最大 8,000 文字) があり、ティーザーを作成したいと考えています。特定の長さ (別の場所で定義します) の後、スペースが続く最後のアルファ文字を見つけたいと思います。その文字以降はすべて削除します。次に、省略記号を追加します (...)

MyString = "The lazy brown fox is not a dog."

この場合、「犬」の前にある「a」以降のすべてを削除します。

MyString = "There are 123 boxes on up the hill, says that 612 guy."

この場合、「612」の前にある「that」以降のすべてを削除します。

MyString = "I fell down the stairs on June 30th, 1962."

この場合、「30 日」より前の「6 月」以降をすべて削除します。

スペースが後に続く最後のアルファ [aZ] 文字の位置を見つけるには、どの正規表現を使用しますか?

MyReg = "";
LastPosition = reFindNoCase(MyReg, MyString);
4

2 に答える 2

3

REFindNoCase についてはよくわかりませんが、REReplaceNoCase で試すことができると思います。ほとんどの正規表現エンジンが行うように、CF が参照を取り戻せることを願っています。

REReplaceNoCase(MyString, "(.*\b[a-zA-Z]+\b)\s.*", "$1", ALL);

編集:後方参照の場合、ドル記号の代わりにバックスラッシュを使用しているようです:

REReplaceNoCase(MyString, "(.*\b[a-zA-Z]+\b)\s.*", "\1", ALL);

そして、うまくいけば、このようなものが得られるはずです。

.*は改行文字以外に\b一致し、単語の境界に一致[a-zA-Z]+し、アルファベット文字\s用であり、その直後のスペース用です。

最初の の貪欲さは.*、最後の単語の後にスペースが続くまで、可能な限りキャプチャするためにここで悪用されています。

$1そして、次のようにエルプスを追加できると思います:

REReplaceNoCase(MyString, "(.*\b[a-zA-Z]+\b)\s.*", "\1 (...)", ALL)

のみを使用したい場合は、これを使用REFind()できます。

REFindNoCase("[A-Za-z](?:\s\d+|\w+,)*\s[^\s]+\.$", MyString);

他の可能なシナリオに対してこれをテストしていないことに注意してください。ただし、上記では機能しないが、これでは機能しないいくつかを試しました。

REFindNoCase("[A-Za-z](?:\s\d+|\s?\w+[,.-]+)*\s[^\s]+[.\s]*$", MyString);

そして、それらはいくつかのテスト対象です: link .

REFind最後のアルファ文字の位置を示します。1 を追加して、元の文字列内のスペースの位置を取得できます。

于 2013-07-11T20:07:15.583 に答える
3

長い文字列を扱っている場合、正規表現は文字列全体をスキャンして最後までスキャンする必要があり、代わりに最後から開始して逆方向に作業する方が効率的です。

このような:

LastPos = len(String);

while( LastPos > 1 )
{
    LastPos = String.lastIndexOf(' ',LastPos-1);

    if ( mid(String,LastPos,1).matches('[a-zA-Z]') )
        break;

}

NewString = left(String,LastPos);

アイデアは、スペースを見つけて後方にステップし続け、前の文字が文字の場合 (または文字列の先頭に達した場合) にループを中断することです。


本当に正規表現ソリューションが必要な場合は、次のようにします。

NewString = rematch('.*[a-zA-Z] ',MyString)[1];

位置を取得するには、 を実行しますlen(NewString)

(?s)(改行が含まれる場合は、ドットが一致するように式の先頭に置く必要があります。)

于 2013-07-11T21:44:00.850 に答える