0

正規表現で「次の文字はこの文字グループからのものであってはならない」と指定するのに問題があります。私は持っている

TOKENS = [":", ".", "'"]
"01:39\t" =~  /\b0\d[#{Regexp.union(TOKENS)}]\d\d^#{Regexp.union(TOKENS)}/
 #=> nil

"\t"私の配列の一部ではないのでTOKENS、上記は一致するはずですが、一致しません。正規表現、特にこの部分を調整するにはどうすればよいですか

^#{Regexp.union(TOKENS)}

文字がこの配列の一部であってはならないと言うのですか?

4

2 に答える 2

0

あなたの/\b0\d[#{Regexp.union(TOKENS)}]\d\d^#{Regexp.union(TOKENS)}/パターンは最終的に次のようになります

/(?-mix:\b0\d[(?-mix::|\.|')]\d\d^(?-mix::|\.|'))/
             ^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^

ここで、正規表現オブジェクトは、無効化された複数行、大文字と小文字を区別しない、フリー スペーシング モードを持つ修飾子グループです。最後^は行アンカーの開始であり、それだけで正規表現全体が台無しになり、どの文字列とも一致しないパターンになります。

、、などを否定したくないので、プロパティを使用して削除する必要があり#{Regexp.union(TOKENS)} ます。文字クラスの場合、これはリテラル char として扱われます (したがって、パイプも否定します)。[...].source(?-mix:...)mixRegexp.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 つのバックスラッシュは、置換パターンのリテラル バックスラッシュを定義し、一致全体を表します][^\-'\\\\\\&'\\&

于 2017-11-07T07:52:28.947 に答える