3

我正在使用 ColdFusion 10。我很少需要使用正则表达式,并且确实需要一些帮助。

我有一些冗长的内容(最多 8,000 个字符)并想创建一个预告片。在一定长度(我将在别处定义)之后,我想找到最后一个后跟空格的字母字符。我将删除该字符之后的所有内容。然后我将添加省略号 (...)

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

在这种情况下,我将删除“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."

在这种情况下,我将删除“30th”之前的“June”之后的所有内容。

我将使用什么正则表达式来查找后跟空格的最后一个 alpha [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紧随其后的空格。

第一个的贪婪在.*这里被利用来尽可能多地捕获,直到你得到最后一个单词后跟一个空格。

我猜你可以在这样的之后添加 ellpses $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);

这些是为数不多的测试对象:链接

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 回答