使用正则表达式提取子字符串

时间:2017-03-28 19:13:06

标签: regex coldfusion

我有以下字符串:

<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来实现它。我认为它适用于一个正则表达式,但我对正则表达式不好。任何人都可以帮助和指导吗?

2 个答案:

答案 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 tutorialsRegExrv2.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, ":")>