正则expression式:拉出一个string中两个标签之间的一个子string
我有以下格式的文件:
数据数据 数据 [开始] 我想要的数据 [结束] 数据
我想用正则expression式从[Start]
和[End]
标签之间获取Data I want
的Data 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; }