提问人:Omar Fareed 提问时间:10/11/2023 最后编辑:ddaOmar Fareed 更新时间:10/11/2023 访问量:69
如果未使用正则表达式以其他字符为前缀,则不允许使用字符
Disallow character if not prefixed with another character using regex
问:
我已将以下正则表达式合并到我的代码中:
.gsub(/(^|[^*])(\*\*)([^*]+)(\*\*)($|[^*])/m, '\1*\3*\5') # bold
我面临的问题是 \3 块(定义为 )目前不允许在文本中使用星号。[^*]+
*
我的目标是修改正则表达式,使其仅在星号前面有转义字符时才允许星号。实现此修改的适当方法是什么?\
示例:我希望它输出**hello \* world**
*hello \* world*
但是我得到的文本与当前正则表达式没有变化。
答:
1赞
Wiktor Stribiżew
10/11/2023
#1
在这些情况下,您可以使用展开的:[^*\\]*(?:\\.[^*\\]*)*
.gsub(/(^|[^*])(\*\*)([^*\\]*(?:\\.[^*\\]*)*)(\*\*)($|[^*])/m, '\1*\3*\5') # bold
请参阅正则表达式演示。可以进一步优化到
.gsub(/(?<!\*)\*\*([^*\\]*(?:\\.[^*\\]*)*)\*\*(?!\*)/m, '*\1*')
查看此正则表达式演示
细节:
(?<!\*)
- 不紧接着*
\*\*
- 一个字符串**
([^*\\]*(?:\\.[^*\\]*)*)
- 第 1 组:除 and 以外的任何零个或多个字符,然后是零个或多个字符,后跟任何其他字符,然后是除 和 之外的零个或多个字符\
*
\
*
\
\*\*
- 一个字符串**
(?!\*)
- 一个位置没有紧随其后*
查看 Ruby 演示:
text = '**hello \* world**'
puts text.gsub(/(?<!\*)\*\*([^*\\]*(?:\\.[^*\\]*)*)\*\*(?!\*)/m, '*\1*')
# => *hello \* world*
评论
0赞
Omar Fareed
10/11/2023
我没有得到这个正则表达式的预期输出,如果问题不清楚,我添加了一个示例。
0赞
Wiktor Stribiżew
10/11/2023
此外,请考虑更复杂的方案。演示中的 s 仅用于逐行演示。gsub(/(?<!\*)((?:\*\*)*)\*\*([^*\\]*(?:\\.[^*\\]*)*)\*\*((?:\*\*)*)(?!\*)/, '\1*\2*\3')
\n
0赞
Omar Fareed
10/11/2023
感谢您的演示,我会看看它
0赞
Wiktor Stribiżew
10/11/2023
@OmarFareed 这完全符合您的要求。请参见 regex101.com/r/gDCCI6/6。我还添加了一个 Ruby 演示。
1赞
Wiktor Stribiżew
10/11/2023
@OmarFareed 请参阅什么是正则表达式中的非捕获组?和正则表达式前瞻组、后视组和原子组。此外,请参阅 regular-expressions.info 和 rexegg.com。
评论