您好,我正在尝试找到一个正则表达式,当它们在 # 内时可以帮助我找到字符串内的所有匹配项,并且仅当 # 前面没有撇号"'"时。
基本上,当我们使用双*像这样加粗文本时,我需要加粗文本,就像这里一样,但是撇号应该用作转义字符。
例如
#Hello 我的名字是Noé#应该看起来像你好,我的名字是Noé
#Hello 这有一个转义撇号'#所以我会匹配到这里#应该看起来像你好,这有一个转义撇号'#所以我会匹配到这里
在长文本中,可能会也可能不会有多个匹配项:">
你好,我是文本 #I 粗体#,我需要知道如何匹配两个"#"中的文本,#I 也不会匹配任何一个,因为我没有尽头">
所以我可以像
"你好,我是文本,我很大胆,我需要知道如何匹配两个'#'内的文本,#I 也不会匹配任何一个'因为我没有结束'
如果 RegExp 无法做到这一点,我可以对有限状态机进行编程,但我希望我可以,提前谢谢你,上帝保佑你!
注意:我现在稍后会处理转义字符,我只需要知道如何处理这个
/(?<!')#.*(?<!')#/gim
这是我唯一能想到的,但老实说,我不知道背后的负面外观是如何工作的:(,有了这个正则表达式,它会匹配错误。例如,如果我输入:
"我是一个文本 #and 我应该是一个匹配#,这不应该 #But 这也应该#,我只是一些随机的额外文本">
从第一个 # 出现到最后一个匹配,如下所示:
"我是一个文本#and 我应该是一个匹配#,这不应该 #But 这也应该#,我只是一些随机的额外文本">
我认为这应该有效:
(?<!')#(.*?)(?<!')#
在这里,您可以看到正则表达式与您的示例一起工作:https://regex101.com/r/wnguiA/1
(?<!')
是负后看,它告诉正则表达式引擎暂时向后退到字符串中,以检查后视中的文本是否可以在那里匹配。(?<!a)b
匹配前面没有a
的b
。
更简单的是匹配任何字符(行终止符除外)的(.*?)
;添加?
告诉捕获组不要贪婪,并在成功令牌的第一个位置停止。
为了防止在所有位置不向左断言'
时触发负回头,您还可以先匹配#
并在它之后进行断言。
#(?<!'#)(.*?)#(?<!'#)
正则表达式演示
不使用非贪婪.*?
的另一种选择是使用与除#
之外的任何字符匹配的否定字符类
然后,当你遇到#
只有在它之前有'
时才使用积极的回望来匹配它。
#(?<!'#)([^#n]*(?:#(?<='#)[^#n]*)*)#(?<!'#)
#(?<!'#)
比赛#
前面没有直接'
(
捕获组 1[^#n]*
可选匹配除#
或换行符以外的任何字符(?:
非捕获组#(?<='#)
比赛#
前面没有直接'
[^#n]*
匹配除#
或换行符以外的任何字符的可选重复
)*
关闭非捕获组,并选择性地重复此操作以匹配所有匹配项
)
关闭组 1#(?<!'#)
比赛#
前面没有直接的'
正则表达式演示