我有一个文件在以下格式:

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
}

请参阅对这个问题拔出文本之间的标记与空间字和点(.)

[\S\s] 是我用的

Regex相匹配的任何角色,包括新的线条

阅读该案文的方括号[]即[启动]和[结束]和验证该阵列表的价值观。 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top