次の形式のファイルがあります。
データデータ データ [始める] 欲しいデータ [終わり] データ
正規表現を使用して、タグとタグData I want
の間からを取得したいと思います。誰かがこれがどのように行われるかを教えてもらえますか?[Start]
[End]
\[start\](.*?)\[end\]
Zhichは、キャプチャ内の中央にテキストを配置します。
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]
[start]
これにより、マーカーとマーカーも削除されるはず[end]
です。
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;
しばらくの間、同様の問題がありましたが、この方法が機能していると言えます...
正規表現を使用して一致するタグを見つけることの落とし穴に関するより完全な説明は、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
開始タグと終了タグの間のデータを解析するために正規表現を使用することはできますが、これが目的のパスであるかどうかについては、じっくり考える必要があります。その理由は、タグがネストする可能性があるためです。タグのネストが発生する可能性がある場合、または発生する可能性がある場合、その言語はもはや正規ではないと言われ、正規表現はそれを解析するための適切なツールではなくなります。
PCRE や perl の正規表現など、多くの正規表現の実装は、この大まかな効果を実現するために使用できるバックトラッキングをサポートしています。しかし、PCRE は (perl とは異なり) 無制限のバックトラッキングをサポートしていないため、タグが多すぎるとすぐに奇妙な方法で問題が発生する可能性があります。
これについて詳しく説明している非常に一般的に引用されているブログ投稿があり ます。
各開始タグの後に終了タグが続くことを保証すれば、次のように動作します。
\[start\](.*?)\[end\]
ただし、次のような複雑なテキストがある場合:
[start] sometext [start] sometext2 [end] sometext [end]
次に、正規表現で問題が発生します。
次の例では、ページ内のすべてのホット リンクを引き出します。
'/<a(.*?)a>/i'
上記のケースでは、次のネストされたケースがないことを保証できます。
'<a></a>'
したがって、これは複雑な問題であり、単純な答えだけでは解決できません。
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
}
角括弧 [] 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;
}