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 

もう 1 つのトリックは、*?を使用することです。キャプチャされた一致の貪欲さをオフにする量指定子。たとえば、一致しない[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 とは異なり) 無制限のバックトラッキングをサポートしていないため、タグが多すぎるとすぐに奇妙な方法で問題が発生する可能性があります。

これについて詳しく説明している非常に一般的に引用されているブログ投稿があり ます。

于 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

角括弧 [] ie[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 に答える