正则表达式,用于匹配 # 之间的文本,并且仅当 # 前面没有"



您好,我正在尝试找到一个正则表达式,当它们在 # 内时可以帮助我找到字符串内的所有匹配项,并且仅当 # 前面没有撇号"'"时。

基本上,当我们使用双*像这样加粗文本时,我需要加粗文本,就像这里一样,但是撇号应该用作转义字符。

例如
#Hello 我的名字是Noé#应该看起来像你好,我的名字是Noé

#Hello 这有一个转义撇号'#所以我会匹配到这里#应该看起来像你好,这有一个转义撇号'#所以我会匹配到这里

在长文本中,可能会也可能不会有多个匹配项:">
你好,我是文本 #I 粗体#,我需要知道如何匹配两个"#"中的文本,#I 也不会匹配任何一个,因为我没有尽头">

所以我可以像
"你好,我是文本,我很大胆,我需要知道如何匹配两个'#'内的文本,#I 也不会匹配任何一个'因为我没有结束'

如果 RegExp 无法做到这一点,我可以对有限状态机进行编程,但我希望我可以,提前谢谢你,上帝保佑你!

注意:我现在稍后会处理转义字符,我只需要知道如何处理这个

/(?<!')#.*(?<!')#/gim

这是我唯一能想到的,但老实说,我不知道背后的负面外观是如何工作的:(,有了这个正则表达式,它会匹配错误。例如,如果我输入:
"我是一个文本 #and 我应该是一个匹配#,这不应该 #But 这也应该#,我只是一些随机的额外文本">

从第一个 # 出现到最后一个匹配,如下所示:

"我是一个文本#and 我应该是一个匹配#,这不应该 #But 这也应该#,我只是一些随机的额外文本">

我认为这应该有效:

(?<!')#(.*?)(?<!')#

在这里,您可以看到正则表达式与您的示例一起工作:https://regex101.com/r/wnguiA/1

(?<!')是负后看,它告诉正则表达式引擎暂时向后退到字符串中,以检查后视中的文本是否可以在那里匹配。(?<!a)b匹配前面没有ab

更简单的是匹配任何字符(行终止符除外)的(.*?);添加?告诉捕获组不要贪婪,并在成功令牌的第一个位置停止。

为了防止在所有位置不向左断言'时触发负回头,您还可以先匹配#并在它之后进行断言。

#(?<!'#)(.*?)#(?<!'#)

正则表达式演示

不使用非贪婪.*?的另一种选择是使用与除#之外的任何字符匹配的否定字符类

然后,当你遇到#只有在它之前有'时才使用积极的回望来匹配它。

#(?<!'#)([^#n]*(?:#(?<='#)[^#n]*)*)#(?<!'#)
  • #(?<!'#)比赛#前面没有直接'
  • (捕获组 1
    • [^#n]*可选匹配除#或换行符以外的任何字符
    • (?:非捕获组
      • #(?<='#)比赛#前面没有直接'
      • [^#n]*匹配除#或换行符以外的任何字符的可选重复
    • )*关闭非捕获组,并选择性地重复此操作以匹配所有匹配项
  • )关闭组 1
  • #(?<!'#)比赛#前面没有直接的'

正则表达式演示

最新更新