あなたの/\b0\d[#{Regexp.union(TOKENS)}]\d\d^#{Regexp.union(TOKENS)}/
パターンは最終的に次のようになります
/(?-mix:\b0\d[(?-mix::|\.|')]\d\d^(?-mix::|\.|'))/
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
ここで、正規表現オブジェクトは、無効化された複数行、大文字と小文字を区別しない、フリー スペーシング モードを持つ修飾子グループです。最後^
は行アンカーの開始であり、それだけで正規表現全体が台無しになり、どの文字列とも一致しないパターンになります。
、、などを否定したくないので、プロパティを使用して削除する必要があり#{Regexp.union(TOKENS)}
ます。文字クラスの場合、これはリテラル char として扱われます (したがって、パイプも否定します)。[...]
.source
(?-mix:...)
m
i
x
Regexp.union
|
TOKENS.join().gsub(/[\]\[\^\\-]/, '\\\\\\&')
正規表現文字クラス内でエスケープする必要があるすべての文字をエスケープし、文字クラスの角括弧の間に配置するために、区切りシーケンスを定義する必要があります。
ルビーのデモ:
TOKENS = [":", ".", "'", "]"]
sep_rx = TOKENS.join().gsub(/[\]\[\^\\-]/, '\\\\\\&')
puts sep_rx
# => :.'\]
rx = /\b0\d[#{sep_rx}]\d\d[^#{sep_rx}]/
puts rx.source
# => \b0\d[:.'\]]\d\d[^:.'\]]
puts "01:39\t" =~ rx
# => 0
Rubularのデモを見る
、、、およびの前にバック.gsub(/[\]\[\^\\-]/, '\\\\\\&')
スラッシュが追加されることに注意してください。の最初の 4 つのバックスラッシュは、置換パターンのリテラル バックスラッシュを定義し、一致全体を表します]
[
^
\
-
'\\\\\\&'
\\&