正则表达式查找后跟空格的最后一个字母字符的位置?

时间:2013-07-11 19:42:02

标签: regex coldfusion

我正在使用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”之前的“那个”之后的所有内容。

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

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

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

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

2 个答案:

答案 0 :(得分:3)

我不确定REFindNoCase,但我认为您可以尝试使用REReplaceNoCase。我希望CF能像大多数正则表达式引擎那样收回引用:

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

对于反向引用,

编辑:,您似乎使用反斜杠而不是美元符号:

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

如果进展顺利,你应该有类似this的东西。

.*除了换行符之外还匹配任何内容,\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以获取原始字符串中空格的位置。

答案 1 :(得分: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)放在表达式的开头,以便点匹配它们。)