これは本当に簡単な質問のように感じますが、私はどこにも答えを見つけることができません。
(注:私はPythonを使用していますが、これは問題ではありません。)
次の文字列があるとします。
s = "foo\nbar\nfood\nfoo"
「food」の「foo」の直後に改行または末尾が続かないという事実に基づいて、「foo」の両方のインスタンスに一致するが「food」には一致しない正規表現を見つけようとしているだけです。ストリング。
これはおそらく私の質問を表現するための非常に複雑な方法ですが、それは作業するための具体的な何かを与えます。
これが私が試したことのいくつかと結果です(注:私が望む結果は[ foo\n
、foo
]です):
foo[\n\Z]
=> [ 'foo\n'
]
foo(\n\Z)
=> [ '\n'
、''
] <=これは改行とEOSに一致するようですが、foo
foo($|\n)
=> [ '\n'
、''
]
(foo)($|\n)
=> [(foo
、'\n'
)、(foo
、''
)] <=ほぼそこにあり、これは使用可能なプランBですが、完璧な解決策を見つけたいと思います。
私が見つけた唯一の機能は次のとおりです。
foo$|foo\n
=> [ 'foo\n'
、 `'foo']
これは、このような単純な例では問題ありませんが、はるかに大きな式で扱いにくくなる可能性があることは簡単にわかります(もちろん、これfoo
は私が実際に使用している大きな式の代わりになります)。
興味深いことに、私の問題に最も近いSOの質問は、これでした。正規表現では、文字列の末尾または特定の文字のいずれかに一致します。
\n
ここでは、「特定の文字」を単純に置き換えることができます。現在、受け入れられた回答は正規表現を使用してい/(&|\?)list=.*?(&|$)/
ます。OPがJavaScriptを使用している(質問はタグでタグ付けされているjavascript
)ので、JavaScript正規表現インタープリターが異なる可能性がありますが、Pythonで上記の正規表現を使用して質問で指定された正確な文字列を使用すると、悪い結果が得られます。
>>> findall("(&|\?)list=.*?(&|$)", "index.php?test=1&list=UL")
[('&', '')]
>>> findall("(&|\?)list=.*?(&|$)", "index.php?list=UL&more=1")
[('?', '&')]
だから、私は困惑しています。