ruby 不允许使用正则表达式在字符前加上其他字符

20jt8wwn  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(87)

我在代码中加入了以下正则表达式:

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

我面临的问题是,\3块(定义为[^*]+)目前不允许在文本中插入*
我的目标是修改正则表达式,使其只允许在转义字符\之前的转义字符。实现这一修改的适当方法是什么?
示例:**hello \* world**我希望它输出*hello \* world*
但我得到的文本没有与当前正则表达式的变化。

1zmg4dgp

1zmg4dgp1#

在这些情况下,您可以使用展开的[^*\\]*(?:\\.[^*\\]*)*

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

参见regex demo。它可以进一步优化,

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

参见this regex demo

  • 详情 *:
  • (?<!\*)-前面没有*的位置
  • \*\*-**字符串
  • ([^*\\]*(?:\\.[^*\\]*)*)-第1组:除了\*之外的任何零个或多个字符,然后是\字符的零个或多个序列,后跟任何其他字符,然后是*\之外的零个或多个字符
  • \*\*-**字符串
  • (?!\*)-后面不紧跟*的位置

参见Ruby demo

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

相关问题