我正在使用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);
答案 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)
放在表达式的开头,以便点匹配它们。)