我有一个格式如下的文件:
数据数据 数据 [开始] 我要的数据 [结尾] 数据
我想使用正则表达式Data I want
从[Start]
和[End]
标签之间获取。谁能告诉我如何做到这一点?
\[start\](.*?)\[end\]
Zhich 会将文本放在捕获的中间。
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]
希望这也应该删除[start]
和[end]
标记。
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;
我有一段时间遇到类似的问题,我可以告诉你这种方法有效......
有关使用正则表达式查找匹配标签的陷阱的更完整讨论,请参见:http: //faq.perl.org/perlfaq4.html#How_do_I_find_matchi。特别要注意,嵌套标签确实需要一个成熟的解析器才能正确解释。
请注意,需要关闭区分大小写才能回答所述问题。在 perl 中,这就是i修饰符:
$ echo "Data Data Data [Start] Data i want [End] Data" \
| perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
Data i want
另一个技巧是使用*? 量词,它关闭捕获的匹配的贪婪。例如,如果您有一个不匹配的[end]标签:
Data Data [Start] Data i want [End] Data [end]
您可能不想捕获:
Data i want [End] Data
虽然您可以使用正则表达式来解析开始标签和结束标签之间的数据,但您需要仔细考虑这是否是您想要走的路径。其原因是标签嵌套的潜力:如果嵌套标签可能发生或可能发生,则称该语言不再是正则的,并且正则表达式不再是解析它的适当工具。
许多正则表达式的实现,例如 PCRE 或 perl 的正则表达式,都支持回溯,可以用来实现这种粗略的效果。但是 PCRE(与 perl 不同)不支持无限回溯,一旦标签过多,这实际上会导致事情以奇怪的方式中断。
有一篇非常常被引用的博客文章对此进行了更多讨论, http: //kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (谷歌搜索并检查缓存,他们似乎有一些停机时间)
好吧,如果您保证每个开始标签后面都有一个结束标签,那么以下内容将起作用。
\[start\](.*?)\[end\]
但是,如果您有复杂的文本,例如以下内容:
[start] sometext [start] sometext2 [end] sometext [end]
那么你会遇到正则表达式的问题。
现在下面的示例将拉出页面中的所有热链接:
'/<a(.*?)a>/i'
在上述情况下,我们可以保证不会有任何嵌套情况:
'<a></a>'
所以,这是一个复杂的问题,不能用简单的答案来解决。
使用 Perl,您可以用 () 包围您想要的数据,然后将其拉出,也许其他语言也有类似的功能。
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
}
使用方括号 [] 即 [Start] 和 [End] 读取文本,并使用值列表验证数组。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;
}