2

文字列の末尾から照合を行う必要がある場合に、Ruby で貪欲でない正規表現を使用することについて混乱しています。

私の文字列:

s = "Some words (some nonsense) and more words (target group)"

そして、結果に「(ターゲットグループ)」を取得したい。どうやってやるの?次のことを試していました:

よく深い:

s.match(/\(.*\)$/)[0]
=> "(some nonsense) and more words (target group)"

s.match(/\(.*\)/)[0]
=> "(some nonsense) and more words (target group)"

非貪欲:

s.match(/\(.*?\)/)[0]
=> "(some nonsense)"

s.match(/\(.*?\)$/)[0]
=> "(some nonsense) and more words (target group)"

最初の文字列には、「()」内に任意の数のグループが含まれる場合と含まれない場合があることに注意してください。

4

4 に答える 4

5

を使用した貪欲でない正規表現アプローチscan

s.scan(/\(.*?\)/).last
=>"(target group)"
于 2013-11-15T01:00:16.433 に答える
2

あなたの質問を理解できません。ですから、これが間違っていたら申し訳ありません:

.*?いつする必要があり[^)]*ますか?

s.match(/\([^)]*\)$/)[0]
=> "(target group)"

とにかく使用することを主張する場合.*?は、嫌がるマッチの前に貪欲なマッチを置きます。

s.match(/^.*(\(.*?\))$/)[1]
=> "(target group)"
于 2013-11-15T00:56:27.473 に答える
0

負の先読みを伴う負のセット

s.match(/\([^)]*\)(?!.*\(.*\))/)[0]

.. 否定先読みは、キャプチャーされた式の最後に置くことができます

貪欲ではない (怠惰な) 否定的な先読み

s.match(/\((?!.*\(.*\)).*?\)/)[0]

.. 否定的な先読みは、最初の繰り返しの前でなければなりません (ここでは、怠惰 = 非貪欲)

于 2016-06-01T10:02:22.333 に答える