正则expression式:拉出一个string中两个标签之间的一个子string

我有以下格式的文件:

数据数据
数据
 [开始]
我想要的数据
 [结束]
数据

我想用正则expression式从[Start][End]标签之间获取Data I wantData I want 。 任何人都可以告诉我如何做到这一点?

 \[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\] 

这应该有望放弃[start][end]标记。

 \[start\](.*?)\[end\] 

Zhich'll把文字放在中间。

 $text ="Data Data Data start Data i want end Data"; ($content) = $text =~ m/ start (.*) end /; print $content; 

我有一段时间有类似的问题,我可以告诉你,这种方法工作…

有关使用正则expression式查找匹配标记的陷阱的更完整的讨论可以在http://faq.perl.org/perlfaq4.html#How_do_I_find_matchifind。; 特别要注意的是,嵌套标签确实需要一个完整的parsing器才能正确解释。

请注意,为了回答上述问题,需要closures大小写。 在Perl中,这是我的修改器:

 $ echo "Data Data Data [Start] Data i want [End] Data" \ | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"' Data i want 

另一个技巧是使用*? 量化器closures捕获的匹配的贪婪。 例如,如果你有一个不匹配的[end]标签:

 Data Data [Start] Data i want [End] Data [end] 

你可能不想捕捉:

  Data i want [End] Data 

虽然您可以使用正则expression式来parsing开始和结束标记之间的数据,但您需要长时间思考,并确定这是否是您想要closures的path。 其原因是标签嵌套的潜力:如果嵌套标签可能发生或可能发生,则说该语言不再是规则的,并且正则expression式不再是parsing它的适当工具。

很多正则expression式的实现,比如PCRE或perl的正则expression式,都支持回溯,可以用来实现这个粗糙的效果。 但是,PCRE(不像perl)不支持无限制的回溯,只要你有太多的标签,这实际上会导致事情以怪异的方式破坏。

有一个非常常见的博客文章,讨论这更多, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (谷歌为它,并检查caching目前,他们似乎有一些停机时间)

那么,如果你保证每个开始标签后面跟着一个结束标签,那么下面就会起作用。

 \[start\](.*?)\[end\] 

但是,如果您有复杂的文字,如下面的内容:

 [start] sometext [start] sometext2 [end] sometext [end] 

那么你会遇到与正则expression式的问题。

现在下面的例子将拉出页面中的所有热链接:

 '/<a(.*?)a>/i' 

在上述情况下,我们可以保证不会有任何嵌套的情况:

 '<a></a>' 

所以,这是一个复杂的问题,不能用简单的答案来解决。

有了Perl,你可以用()把你想要的数据包围起来,稍后把它拉出来,也许其他语言也有类似的function。

 if ($s_output =~ /(data data data data START(data data data)END (data data)/) { $dataAllOfIt = $1; # 1 full string $dataInMiddle = $2; # 2 Middle Data $dataAtEnd = $3; # 3 End Data } 

参考这个问题,在空格字符和点( . )的标签之间拉出文本

我使用的是[\S\s]

正则expression式匹配包括新行在内的任何字符

用方括号[]读取文本,例如[开始]和[结束],并使用值列表validation数组。 jsfiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

 var mergeFields = ["[sitename]", "[daystoholdquote]", "[expires]", "[firstname]", "[lastname]", "[sitephonenumber]", "[hoh_firstname]", "[hoh_lastname]"]; var str = "fee [sitename] [firstname] \ sdfasd [lastname] "; var res = validateMeargeFileds(str); console.log(res); function validateMeargeFileds(input) { var re = /\[\w+]/ig; var isValid; var myArray = input.match(re); try{ if (myArray.length > 0) { myArray.forEach(function (field) { isValid = isMergeField(field); if (!isValid){ throw e; } }); } } catch(e) { } return isValid; } function isMergeField(mergefield) { return mergeFields.indexOf(mergefield.toLowerCase()) > -1; }