0

最初の発生で停止する正規表現を作成しようとしています。置くことで貪欲にならないことはわかってい?ます。

文字列について考えてみましょう。

"This is sample text located at first line and located at second line."

pattern1ここでは、を使用して検索してpattern2います。

  • pattern1"text"
  • pattern2"located at"

上記の文字列で、を抽出したいのですが"text"、検索パターンは"located at"であるため、次の正規表現を使用しています。

/is.*sample(.*)located at?/

located at欲張りでないものを作成するにはどうすればよいですか?http://rubular.com/を使用して正規表現を確認しています。

4

1 に答える 1

2

正規表現が正しくありません。

最初の「場所」の前に出現する単一の「単語」が必要な場合は、次を使用できます。

"This is sample text located at first line and located at second line."[/(\S+)\s+located at/, 1]
=> "text"

「単語」は、を使用して空白以外の文字を意味するように定義している\Sため、句読点と数字は英字に含まれます。\w必要に応じて、他のクラスを使用することもできます[A-Za-z0-9_][a-z]それ以外の場合は、次のように使用します。

"This is sample text located at first line and located at second line."[/([a-z]+)\s+located at/i, 1]
=> "text"

「サンプル」と最初の「場所」の間にあるテキストが必要な場合は、次を使用できます。

"This is sample text located at first line and located at second line."[/sample\s+(.+?)\s+located at/, 1]
=> "text"

あなたのパターン/test.*sample(.*)located at?/では、複数を使用しています。.*これは、ゼロ以上のものを意味します(ただし、コンテキストによっては実際には何もありませんが、今必要なものよりも深いです)。それは貪欲なので、その「もっと」はあなたが衝突している部分です。そして、それを2回使用するので、それは二重に貪欲です。を追加することで「欲張りでない」バリアントを使用できます?が、正規表現エンジンにロープを与えすぎて遊ぶことができないため、それでも正しく機能しません。私のパターンはそれをすべて引き締め?、最初の2つで修飾子を使用する必要性を減らします。

私の3番目の例では、.+これも必要です。これも、貪欲であり、モデレートする必要があるためです。

最後に、パターンが変更にat?適用されていない場合、前のパターンに作用しているため、エンジンは「ゼロまたは1の「t」を見つける必要があります」ということになります。これは、一致するため、必要なものではありません。 「a」または「at」。?.*t

于 2012-12-06T15:12:45.003 に答える