Techioz Blog

正規表現を使用して別の文字が接頭辞として付いていない場合、文字を許可しない

概要

次の正規表現をコードに組み込みました。

.gsub(/(^|[^*])(\*\*)([^*]+)(\*\*)($|[^*])/m, '\1*\3*\5') # bold

私が直面している問題は、\3 ブロック ([^*]+ として定義) では現在、テキスト内にアスタリスク * を使用できないことです。

私の目的は、エスケープ文字  が前にある場合にのみアスタリスクを許可するように正規表現を変更することです。この変更を実現するための適切なアプローチは何ですか?

例: hello * world hello * world と出力したい

しかし、現在の正規表現では何も変更せずにテキストを取得しました。

解決策

このような状況では、展開された [^*\](?:.[^*\])* を使用できます。

.gsub(/(^|[^*])(\*\*)([^*\\]*(?:\\.[^*\\]*)*)(\*\*)($|[^*])/m, '\1*\3*\5') # bold

正規表現のデモを参照してください。さらに最適化できるものは、

.gsub(/(?<!\*)\*\*([^*\\]*(?:\\.[^*\\]*)*)\*\*(?!\*)/m, '*\1*') 

この正規表現のデモを参照してください

詳細:

Ruby のデモを参照してください。

text = '**hello \* world**'
puts text.gsub(/(?<!\*)\*\*([^*\\]*(?:\\.[^*\\]*)*)\*\*(?!\*)/m, '*\1*') 
# => *hello \* world*