我在代码中加入了以下正则表达式:
.gsub(/(^|[^*])(\*\*)([^*]+)(\*\*)($|[^*])/m, '\1*\3*\5') # bold
我面临的问题是,\3块(定义为[^*]+)目前不允许在文本中插入*。我的目标是修改正则表达式,使其只允许在转义字符\之前的转义字符。实现这一修改的适当方法是什么?示例:**hello \* world**我希望它输出*hello \* world*但我得到的文本没有与当前正则表达式的变化。
[^*]+
*
\
**hello \* world**
*hello \* world*
1zmg4dgp1#
在这些情况下,您可以使用展开的[^*\\]*(?:\\.[^*\\]*)*:
[^*\\]*(?:\\.[^*\\]*)*
.gsub(/(^|[^*])(\*\*)([^*\\]*(?:\\.[^*\\]*)*)(\*\*)($|[^*])/m, '\1*\3*\5') # bold
参见regex demo。它可以进一步优化,
.gsub(/(?<!\*)\*\*([^*\\]*(?:\\.[^*\\]*)*)\*\*(?!\*)/m, '*\1*')
参见this regex demo
(?<!\*)
\*\*
**
([^*\\]*(?:\\.[^*\\]*)*)
(?!\*)
参见Ruby demo:
text = '**hello \* world**' puts text.gsub(/(?<!\*)\*\*([^*\\]*(?:\\.[^*\\]*)*)\*\*(?!\*)/m, '*\1*') # => *hello \* world*
1条答案
按热度按时间1zmg4dgp1#
在这些情况下,您可以使用展开的
[^*\\]*(?:\\.[^*\\]*)*
:参见regex demo。它可以进一步优化,
参见this regex demo
(?<!\*)
-前面没有*
的位置\*\*
-**
字符串([^*\\]*(?:\\.[^*\\]*)*)
-第1组:除了\
和*
之外的任何零个或多个字符,然后是\
字符的零个或多个序列,后跟任何其他字符,然后是*
和\
之外的零个或多个字符\*\*
-**
字符串(?!\*)
-后面不紧跟*
的位置参见Ruby demo: