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

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

我想使用Regex从[Start][End]标签之间获取Data I wantData I want 谁能告诉我这是怎么做到的?

===============>>#1 票数:63

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

Zhich将文本放在捕获中间。

===============>>#2 票数:23 已采纳

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

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

===============>>#3 票数:5

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

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

===============>>#4 票数: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

===============>>#5 票数:4

虽然您可以使用正则表达式来解析开始和结束标记之间的数据,但您需要仔细思考这是否是您想要关闭的路径。 它的原因是标签嵌套的可能性:如果嵌套标签可能发生或可能发生,则该语言不再是规则的,并且正则表达式不再是解析它的正确工具。

许多正则表达式实现(例如PCRE或perl的正则表达式)支持可用于实现此粗略效果的回溯。 但PCRE(与perl不同)不支持无限制的回溯,一旦你有太多的标签,这实际上可能导致事情以奇怪的方式破坏。

有一篇非常常被引用的博客文章更多地讨论了这个问题, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google for it并检查当前的缓存,它们似乎有一些停机时间)

===============>>#6 票数:3

好吧,如果您保证每个开始标记后跟一个结束标记,那么以下内容就可以了。

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

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

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

然后你会遇到正则表达式的问题。

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

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

在上面的例子中,我们可以保证不会有任何嵌套的情况:

'<a></a>'

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

===============>>#7 票数: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
}

===============>>#8 票数:0

请参阅此问题以在带有空格字符和点的标记之间拉出文本( .

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

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

===============>>#9 票数: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;
}

  ask by Dan translate from so

未解决问题?本站智能推荐:

关注微信公众号