次の 3 行があるとします。
the quick brown fox
the brown fox
the quick brown quick fox
正規表現を使用して、単語を除く各行のすべてを切り取ることはできますquick
か?
最終結果は次のようになります。
quick
quickquick
次の 3 行があるとします。
the quick brown fox
the brown fox
the quick brown quick fox
正規表現を使用して、単語を除く各行のすべてを切り取ることはできますquick
か?
最終結果は次のようになります。
quick
quickquick
詳細は使用している言語によって異なりますが、正規表現でこれを行うための一般的なアプローチをいくつか示します (Python のコード サンプル)。
ターゲット文字列のすべての一致を検索し、各一致を 1 つの文字列に結合します。
>>> import re
>>> s = 'the quick brown quick fox'
>>> ''.join(re.findall('quick', s))
'quickquick'
ターゲット文字列以外のすべてに一致する正規表現を作成し、各一致を空の文字列に置き換えます (これは通常、リストされている他の選択肢よりもはるかに困難です)。
>>> re.sub('(?!quick|(?<=q)uick|(?<=qu)ick|(?<=qui)ck|(?<=quic)k).', '', s)
'quickquick'
キャプチャ グループを使用して、ターゲット文字列が出現するまですべてを照合し、ターゲット文字列だけに置き換えます。
>>> re.sub('.*?(quick|$)', r'\1', s)
'quickquick'
例のように文字列に複数の行がある場合は、最初に改行で文字列を分割するか、改行を維持するようにソリューションを適応させることができます。次に例を示します。
>>> s = '''the quick brown fox
... the brown fox
... the quick brown quick fox'''
>>> print ''.join(re.findall('quick|[\r\n]', s))
quick
quickquick
>>> print re.sub('.*?(quick|$)', r'\1', s, flags=re.MULTILINE)
quick
quickquick
文字列の操作に正規表現だけを使用することはありません。パターンマッチングのみを行います。実装に使用しているツールによっては、通常、正規表現一致による文字列置換を行うことができます。たとえば、Bash ターミナルからは Sed を使用でき、PHP からは preg_replace() を使用できます。
lookahead
はい、正規表現は、実装およびlookbehind
構造によってその検索が可能です。
たとえば、必要なことを行う正の先読み式を使用する Python プログラムは次のとおりです。
import re
s = '''the quick brown fox
the brown fox
the quick brown quick fox'''
rx = re.compile('(?!quick).*')
print rx.findall(s)
出力:
['the quick brown fox', '', 'the brown fox', '', 'the quick brown quick fox', '']