正则表达式,用于查找后面跟有空格的最后一个alpha字符的位置



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

我有一些冗长的内容(最多8000个字符),想创建一个预告片。在一定长度(我将在其他地方定义)之后,我想找到后面跟着空格的最后一个alpha字符。我将删除该字符之后的所有内容。然后我将添加省略号(…)

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

在这种情况下,我会删除"a"之后、"dog"之前的所有内容。

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."

在这种情况下,我会删除"6月"之后"30日"之前的所有内容。

我将使用哪个正则表达式来查找后面跟有空格的最后一个alpha[a-Z]字符的位置?

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

我不确定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之后添加ellpses,如下所示:

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

如果你只想使用REFind(),你可以使用这个:

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

注意,我还没有针对其他可能的场景进行测试,但我尝试了一些不适用于上述场景的场景,但适用于以下场景:

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

以下是为数不多的测试科目:链接。

REFind将为您提供最后一个alpha字符的位置。您可以加1来获得空间在原始字符串中的位置。

如果您处理的是长字符串,正则表达式需要扫描整个字符串才能到达末尾,而从末尾开始并向后工作可能更有效。

像这样:

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)放在表达式的开头,以便点与它们匹配。)

最新更新