48

我有一个格式如下的文件:

数据数据
数据
[开始]
我要的数据
[结尾]
数据

我想使用正则表达式Data I want[Start][End]标签之间获取。谁能告诉我如何做到这一点?

4

9 回答 9

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

Zhich 会将文本放在捕获的中间。

于 2008-08-04T13:52:06.043 回答
23
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

希望这也应该删除[start][end]标记。

于 2008-08-04T13:55:05.647 回答
5
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

我有一段时间遇到类似的问题,我可以告诉你这种方法有效......

于 2012-10-06T16:52:08.530 回答
4

有关使用正则表达式查找匹配标签的陷阱的更完整讨论,请参见: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
于 2008-08-20T19:14:19.237 回答
4

虽然您可以使用正则表达式来解析开始标签和结束标签之间的数据,但您需要仔细考虑这是否是您想要走的路径。其原因是标签嵌套的潜力:如果嵌套标签可能发生或可能发生,则称该语言不再是正​​则的,并且正则表达式不再是解析它的适当工具。

许多正则表达式的实现,例如 PCRE 或 perl 的正则表达式,都支持回溯,可以用来实现这种粗略的效果。但是 PCRE(与 perl 不同)不支持无限回溯,一旦标签过多,这实际上会导致事情以奇怪的方式中断。

有一篇非常常被引用的博客文章对此进行了更多讨论, http: //kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (谷歌搜索并检查缓存,他们似乎有一些停机时间)

于 2008-09-15T14:18:27.953 回答
3

好吧,如果您保证每个开始标签后面都有一个结束标签,那么以下内容将起作用。

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

但是,如果您有复杂的文本,例如以下内容:

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

那么你会遇到正则表达式的问题。

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

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

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

'<a></a>'

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

于 2009-05-11T20:08:30.597 回答
1

使用 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
}
于 2008-08-04T14:00:04.373 回答
0

请参阅此问题以提取带有空格字符和点 ( .)的标签之间的文本

[\S\s]是我用的那个

正则表达式匹配任何字符,包括换行符

于 2013-08-28T21:12:48.020 回答
0

使用方括号 [] 即 [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;
}
于 2014-09-12T08:26:38.207 回答