正規表現:最初に出現する文字までマッチング


358

特定の文字が最初に出現するまでのすべてに一致するパターンを探しています。- セミコロン

私はこれを書いた:

/^(.*);/

ただし、実際には、セミコロンが最後に出現するまでのすべて(セミコロンを含む)に一致します。


65
/^(.*?);/動作するはずですが(それはnon-greedyと呼ばれます)、指定された答えを使用した[^;]*方が優れています。
Pascal

セミコロン自体ではなく、セミコロンの後のすべてをどのように選択しますか?
Muhammad Umer 2013

これが機能するのを見てください、\w+(?!([^]+;)|;)しかしこれはなぜですか?.+(?!([^]+;)|;)
Muhammad Umer 2013

1
パスカル、あなたはそれを答えとして書いたはずです!
Sean Kendle 2015

@Pascalこれは答えとして適しています!ありがとう!
neverMind9

回答:


503

あなたは必要です

/[^;]*/

[^;]ある文字クラスは、すべてのものが、セミコロンと一致しました。

perlreマンページを引用するには:

文字のリストを[]で囲むことにより、文字クラスを指定できます。これは、リストの任意の文字と一致します。「[」の後の最初の文字が「^」の場合、クラスはリストにない任意の文字と一致します。

これはほとんどの正規表現方言で機能するはずです。


このソリューションの優れた点は、行の終わりにも一致することです。たとえば、私の場合、私が持っていてfoo=bar;baz=bax;bab=baf、必要なものbab=bafがまったくない場合でも一致しました;。スペックにターゲットシンボル以外のすべてと一致する場合、なぜ機能するか
わかりませ

303

/^(.*?);/

作業?

?怠惰なオペレータ、マッチングの前にできるだけ少しように正規表現グラブです;


4
そうですが、Tim Toadyへの重炭酸塩の拡張に続いて、怠惰な量指定子にバックトレーキングが含まれているため、否定された文字クラスが勝つと思います。とにかく+1。
Amarghosh、2010年

3
パフォーマンスのトピックについて読む価値がある:blog.stevenlevithan.com/archives/greedy-lazy-performance
Glenn Slaven

38

/^[^;]*/

[^;]は、セミコロン以外のすべてに一致します。角かっこは、セットマッチング演算子です。基本的には、この文字セットの任意の文字と一致します。^最初にを付けると逆の一致になるため、このセットにないものと一致します。


3
この回答の最初の^は、正規表現にまったく異なる意味を与えることに注意してください。正規表現は、文字列の先頭から始まる一致のみを検索します。この場合、それは効果的に無操作しないであろう場合、あなたは一度だけ正規表現を実行します。1つの文字列内で複数の一致を検索する場合は、最初の^を使用する必要があります。
Dan Breslau

4
彼はセミコロンの最初の出現まですべてを一致させたいと言ったので、私は彼が文字列の最初から意味していると想定しました。
Glenn Slaven、2010年



8

サンプルテキスト:

"this is a test sentence; to prove this regex; that is g;iven below"

たとえば、上記のサンプルテキストがある場合、正規表現/(.*?\;)/;、セミコロンを含む最初のセミコロン()までのすべてを提供します。"this is a test sentence;"


3
;正規表現の特殊文字ではないため、char をエスケープする必要はありません。グループ化()も必要ありません。あなたは一緒に行くことができます/.*?;/
Aliaksei Kliuchnikau

1
はい、あなたは全く正しいです。脱出は「申し訳ありませんが安全」のようなものでした
ポンチョス2012年

2
これが私が探していた答えです。だから?最初の試合で試合を終了しますか?これの名前は何ですか(これを呼び出しましょう)正規表現のプロパティですか?
Parziphal

1
@Parziphal ?文字は一致を遅延させます(可能な限り数回一致します)。最初のセミコロンまでの正規表現に一致する文字について考えてみてください。
そうすると、あきらめる

5

これは正規表現による解決策ではありませんが、問題を説明するのに十分簡単なものです。文字列を分割して、配列から最初の項目を取得するだけです。

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

出力

$ php test.php
match everything until first

5

属性を含むxmlタグ内のすべての文字を一致させる方法を見つけようとしていたので、これは私にとって非常に役に立ちました。私は「すべてを最後まで一致させる」問題に遭遇していました:

/<simpleChoice.*>/

しかし、次の方法で問題を解決できました:

/<simpleChoice[^>]*>/

この投稿を読んだ後。皆さんありがとう。


1
機械のフォーマット、正規表現は自然言語用であるため、実際にhtml / xml(各言語またはフレームワークには独自のクラスがあります)を解析する方が効率的であることがわかりました。
Leon Fedotov、2011

1
いいね。これを使用して、<!DOCTYPE>タグに構文エラーがあるxmlドキュメントを修正しました。パーサーはそれを処理することができなかったので。
Martin Schneider

5

これは、各文字列で最初に出現するものまで一致し、後続の出現は無視されます。

/^([^;]*);*/

3

"/^([^\/]*)\/$/" 次のような配列から上位の「フォルダ」のみを取得するために私のために働いた:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

2

誰もあなたに正しい答えを与えてくれなかったので本当に悲しい

正規表現では、?それは貪欲ではありません。デフォルトでは、正規表現はできる限り一致します(貪欲)

単に?そして、それは貪欲ではなく、できるだけ一致しません!

幸運を祈ります。


3
これは実際の正規表現の実装に大きく依存し、すべての実装に貪欲でないモードがあるわけではありません。
空手犬2015

0

見つけた

/^[^,]*,/

うまくいきます。

'、'はここでは「区切り文字」です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.