0

両側がちょうど 3 つの大文字で囲まれている小文字のすべてのインスタンスを見つけようとしています。次に、このパターンが出現するたびに印刷したいと思います。これは python チャレンジでのチャレンジです。ここに私が持っているものがあります:

contents = "XXXiXXXjXXX"
contents.scan(/[^A-Z]*[A-Z]{3}[a-z][A-Z]{3}[^A-Z]*/) { |i| print i[3] }

"i"印刷すべきときにのみ印刷します"ij"。私の正規表現の何が問題になっていますか?

4

3 に答える 3

0

2つのこと。

  • あなた[^A-Z]*は何もしません
  • スキャン ポインタは最初に完全一致を超えて進みます。これが「j」を取得しない理由です。

やや複雑なルックアラウンド ソリューション:

re = /
  (?<=[A-Z]{3}) # 3 uppers behind
  (?<![A-Z]{4}) # but not 4
  [a-z] # one lower
  (?=[A-Z]{3}) # 3 uppers ahead
  (?![A-Z]{4}) # but not 4
/x

'XXXiXXXjXXX'.scan re
#=> ["i", "j"]
于 2013-02-05T04:13:30.223 に答える
0

間違っている点がいくつかあり、何が間違っているのかを説明するのは実際的ではありません。

単一の正規表現でそれを行う必要がない場合は、次の簡単な方法があります。

puts " #{contents} ".split(/[A-Z]{3}/).&(("a".."z").to_a).join
于 2013-02-05T03:35:38.837 に答える
-1

事前/事後基準を削除して一致しない場合、正規表現は機能します。次に、次のように、抽出する値の周囲にキャプチャ グループとして括弧を追加する必要があります。

match = contents.match(/[A-Z]{3}([a-z])[A-Z]{3}/)
match[1] if match
于 2013-02-05T03:15:46.483 に答える