我有以下字符串:
<cfset foo="Students: Am Goron, rika Mrks, Apl Rirez, Ktsana Tanam Course Location: Training Center - Hillsboro, OR - Hillsboro OR 97124 Course Date/Time: February 03, 2017">
我想使用正则表达式仅提取学生列表:
Am Goron, rika Mrks, Apl Rirez, Ktsana Tanam
如果我使用替换,我必须使用许多replace
来实现它。我认为它适用于一个正则表达式,但我对正则表达式不好。任何人都可以帮助和指导吗?
答案 0 :(得分:3)
请不要理会有人在评论中所做的侮辱。这不是什么原因。
Anywho,有许多ColdFusion字符串函数可以让您的工作更轻松。这就是我的所作所为。这假设你的字符串的某些部分将始终是相同的。
可能效率不高,但它会帮助我们逐步完成我们正在做的事情,并为您提供精确控制。
<cfset StringVar = "Students: Am Goron, rika Mrks, Apl Rirez, Ktsana Tanam Course Location: Training Center - Hillsboro, OR - Hillsboro OR 97124 Course Date/Time: February 03, 2017">
<!---Set total length of string --->
<cfset LengthIndent = len(StringVar)>
<!---Trim off the Students: part--->
<cfset StringVar = Right(StringVar,LengthIndent-9)>
<!---Trim up to the Course Location: part--->
<cfset StringVar = SpanExcluding(StringVar, ":")>
<!---Set total length of REMAINING string --->
<cfset LengthIndent = len(StringVar)>
<!---Trim off the Course Location: part--->
<cfset StringVar = LEFT(StringVar,LengthIndent-15)>
<!---Outputting this will give you ONLY names of students--->
<cfoutput>#StringVar#</cfoutput>
答案 1 :(得分:3)
正则表达式也不是我的强项,但有online tutorials和RegExrv2.1等测试网站可以用来练习。通过一些阅读,我想出了这个:
<cfset list = reReplaceNoCase(text, "^Students:(.*?)Course Location:.*$", "\1", "all")>
将其分解,搜索一个字符串:
^Students:
- 以&#34;学生:&#34; (.+?)
- 后跟一个或多个字符作为捕获组Course Location:
- 后面是课程地点.*$
- 以零个或多个字符结尾然后使用backreference,即\1
替换除了匹配的群组,即学生列表。
如果您更喜欢非正则表达式选项,您还可以作弊(稍微)并在课程位置之前插入额外的冒号,即:
。这将允许您将字符串视为由冒号分隔的列表,并使用列表函数提取第二个元素:
<cfset list = listGetAt( replace(text, "Course Location:", ":Course Location:"), 2, ":")>