题
我有一个文件在以下格式:
Data Data Data [Start] Data I want [End] Data
我想要抓住的 Data I want
从之间 [Start]
和 [End]
标签使用Regex.任何人都可以告诉我这怎么可能做了什么?
解决方案
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]
这应该我们希望下降的 [start]
和 [end]
标记。
其他提示
\[start\](.*?)\[end\]
Zhich将把文本中内捕获。
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;
我有一个类似问题的同时,我可以告诉你这个方法...
一个更完整的讨论的陷阱的使用regex找到匹配的标记可以发现: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi.特别是,要知道,筑巢的标签真的需要一个全面的分析器,以便被正确解释。
注意情况下,敏感度,将需要关闭为了回答这个问题作说明。在perl,那是的 我 修改:
$ echo "Data Data Data [Start] Data i want [End] Data" \
| perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
Data i want
其他的技巧是使用 *? quantifier关闭贪婪的捕获相匹配。例如,如果你有一个不匹配 [结束] 标签:
Data Data [Start] Data i want [End] Data [end]
你可能不想要捕获:
Data i want [End] Data
虽然可以使用一个定期表达的分析数据之间的开放和关闭的标记,你需要想长期和艰苦是否这是一个路径你想下去。它的原因是潜在的标签到nest:如果嵌套标签可能曾经发生或可能曾经发生时,语言是说不再是定期和经常表达不再是适当的工具,用于分析它。
许多经常表达的实现,例如PCRE或perl regular expressions,支持回溯可用于实现这个粗略的效果。但PCRE(不同于perl)不支持无限回溯,而这实际上可能会导致的东西,打破怪异的方式尽快你有太多的标记。
有一个非常常被引用博客,探讨了这个更大, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google为它并检查缓目前,他们似乎具有一些停工时间)
好吧,如果你保证,每一个开始标记是后端的标签,然后以下会的工作。
\[start\](.*?)\[end\]
但是,如果你有复杂的文本,例如以下:
[start] sometext [start] sometext2 [end] sometext [end]
然后你会遇到的问题与regex.
现以下例将撤出所有热链接在一个网页:
'/<a(.*?)a>/i'
在上述情况下,我们可以保证,不会有任何嵌套的情况下:
'<a></a>'
因此,这是一个复杂的问题并不能解决的一个简单的答案。
Perl你可以环绕你想要的数据与()'s拉出来后,也许还有其他的语言有一个类似的功能。
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
}
阅读该案文的方括号[]即[启动]和[结束]和验证该阵列表的价值观。 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;
}