文字列から区切られたテキストを取得する正規表現を作成するにはどうすればよいですか? たとえば、次のような文字列が与えられた場合
text ###token1### text text ###token2### text text
を引き出す正規表現が欲しい###token1###
。はい、区切り文字も必要です。別のグループを追加することで、両方を取得できます。
(###(.+?)###)
文字列から区切られたテキストを取得する正規表現を作成するにはどうすればよいですか? たとえば、次のような文字列が与えられた場合
text ###token1### text text ###token2### text text
を引き出す正規表現が欲しい###token1###
。はい、区切り文字も必要です。別のグループを追加することで、両方を取得できます。
(###(.+?)###)
/###(.+?)###/
###が必要な場合は、
/(###.+?###)/
? _ ?を持っていない場合、貪欲でないことを意味します。、それからそれはつかみすぎます。
たとえば'###token1### text text ###token2###'
、すべてがつかまれます。
私の最初の答えは、+ ではなく * でした。*は0以上を意味します。+ は 1 以上を意味します。* は、###### を有効なものとして見つけられるため、間違っていました。
正規表現をいじるため。Windowsにはhttp://www.weitz.de/regex-coach/を強くお勧めします。必要な文字列と正規表現を入力して、実際の動作を確認できます。
選択したテキストは、正規表現を使用している場所に応じて、\1 または $1 に保存されます。
Perlでは、実際には次のようなものが必要です。
$text = 'text ###token1### text text ###token2### text text';
while($text =~ m/###(.+?)###/g) {
print $1, "\n";
}
これにより、whileループ内で各トークンが順番に提供されます。(。*?)は、区切り文字間の最短ビットを確実に取得し、トークンが'token1###テキストテキスト###token2'であると見なさないようにします。
または、それらを保存したいだけの場合は、すぐにループしないでください。
@tokens = $text =~ m/###(.+?)###/g;
()と\xを使用します。トークン内のテキストが常に#で区切られていると想定する単純な例:
text (#+.+#+) text text (#+.+#+) text text
()の内容は、\1と\2を使用して取得できます(置換式の最初のセットは\ 1、2番目のセットは\ 2です(エディターで検索/置換を実行していると仮定します)。たとえば、置換式は次のようになります。
token1: \1, token2: \2
上記の例では、次のようになります。
token1: ###token1###, token2: ###token2###
プログラムで正規表現ライブラリを使用している場合は、おそらく関数を呼び出して、コンテンツの最初と2番目のトークンを取得します。これは、前後に()で示しています。
このような区切り文字を使用している場合は、基本的に最初の区切り文字を取得してから、終了区切り文字の後に終了区切り文字が続くものと一致しないものを取得します。上記の例のように、[^#]が終了区切り文字がないことを確認するチェックとして機能しない場合は、特別な注意が必要です。これは、単一の#によって正規表現が失敗するためです(つまり、 "### foo#bar# ##)。上記の場合、解析する正規表現は、空のトークンが許可されていると仮定すると次のようになります(許可されていない場合は、*を+に変更します)。
###([^#] |#[^#] | ## [^#])* ###
###token2### も一致させたいと仮定すると...
/###.+###/