在关键短语之间查找文本

时间:2013-05-18 21:20:42

标签: regex coldfusion

我的var中有一些文字:

<cfsavecontent variable="foo">
element.password_input=
<div class="holder">
<label for="$${input_id}" > $${label_text}</label>
<input name="$${input_name}" id="$${input_id}" value="$${input_value}" type="password" />
</div>
# END element.password_input
element.text_input=
<div class="ctrlHolder">
<label for="$${element_id}" > $${element_label_text}</label>
<input name="$${element_name}" id="$${element_id}" 
value="$${element_value}" type="text" 
class="textInput"  />
</div>
# END element.text_input
</cfsavecontent>

我正在尝试解析var以获取所有不同的元素类型,这是我到目前为止所拥有的:

ar = REMatch( "element\.+(.*=)(.*?)*", foo )

但它只给了我这个部分:

element.text_input=
element.password_input=

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

您当前的问题是,默认情况下.不包含换行符 - 您需要在正则表达式中使用标记(?s)才能执行此操作。

然而,简单地启用该标志仍然不会导致您当前的正则表达式执行您期望它执行的操作。

更好的正则表达式是:

(element\.\w+)=(?:[^##]+|##(?! END \1))+(?=## END \1)

然后,您将ListFirst(match[i],'=')ListRest(match[i],'=')获取名称和值。 (rematch不会返回捕获的组)。

(显然上面的#s加倍,以逃避它们。)


解析上述正则表达式是:

(element\.\w+)=

匹配element.和任何字母数字,将其放入捕获组1,然后匹配=字符。

(?:
    [^##]+
|
    ##(?! END \1)
)+

匹配任意数量的非哈希字符,或未跟随结尾标记的哈希(使用否定前瞻(?!...))并引用捕获组1(\1),重复多次使用非捕获组(+)尽可能多的时间((?:...))。

(?=## END \1)

预测(?=...)确认变量的结束标记存在。