parsing -正则表达式:在字符串中的两个标签之间提取子字符串

Translate

我有以下格式的文件:

Data Data
Data
[Start]
Data I want
[End]
Data

我想抓住Data I want从之间[Start][End]使用正则表达式的标签。谁能告诉我该怎么做?

This question and all comments follow the "Attribution Required."

所有的回答

Translate
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

希望这应该放弃[start][end]标记。

来源
Translate
\[start\](.*?)\[end\]

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

来源
Translate
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

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

来源
Translate

有关使用正则表达式查找匹配标签的陷阱的更完整讨论,请参见: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 

另一个技巧是使用*?量词可关闭捕获的匹配的贪婪性。例如,如果您有一个不匹配的[结束]标签:

Data Data [Start] Data i want [End] Data [end]

您可能不想捕获:

 Data i want [End] Data
来源
Translate

尽管您可以使用正则表达式来解析打开标签和结束标签之间的数据,但您需要认真思考一下这是否是您想走的一条路。造成这种情况的原因是标签有可能嵌套:如果嵌套标签可能发生或可能发生,则据说该语言不再是正则语言,而正则表达式不再是解析它的合适工具。

许多正则表达式实现(例如PCRE或perl的正则表达式)都支持回溯,可用于实现这种粗糙效果。但是PCRE(与perl不同)不支持无限的回溯,而实际上,一旦标签太多,就可能以奇怪的方式破坏事物。

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

来源
Translate

好吧,如果您保证每个开始标记后面都有一个结束标记,那么下面的方法将起作用。

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

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

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

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

现在,以下示例将提取页面中的所有热链接:

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

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

'<a></a>'

因此,这是一个复杂的问题,不能仅仅通过简单的答案来解决。

来源
Translate

使用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
}
来源
Translate

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

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

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

来源
Translate

用方括号[]即[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;
}
来源