如果未使用正则表达式以其他字符为前缀,则不允许使用字符

Disallow character if not prefixed with another character using regex

提问人:Omar Fareed 提问时间:10/11/2023 最后编辑:ddaOmar Fareed 更新时间:10/11/2023 访问量:69

问:

我已将以下正则表达式合并到我的代码中:

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

我面临的问题是 \3 块(定义为 )目前不允许在文本中使用星号。[^*]+*

我的目标是修改正则表达式,使其仅在星号前面有转义字符时才允许星号。实现此修改的适当方法是什么?\

示例:我希望它输出**hello \* world***hello \* world*

但是我得到的文本与当前正则表达式没有变化。

正则表达式 Ruby

评论

1赞 dawg 10/11/2023
请添加示例输入和所需的输出。
1赞 InSync 10/11/2023
相关:带转义引号的带引号的带引号的字符串的正则表达式
2赞 InSync 10/11/2023
如果你正在处理 Markdown,最好使用解析器。可能的重复项:Ruby:如何像 GitHub 或 BitBucket 一样从 Markdown 生成 HTML?,更好的 ruby markdown 解释器?
0赞 Omar Fareed 10/11/2023
我正在尝试用 markdown 做另一件事
0赞 Stefan 10/11/2023
@OmarFareed你能解释一下你还在做什么,为什么 Markdown 解析器没有帮助吗?

答:

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.inforexegg.com