Javascript 正则表达式:匹配下划线包装的单词,除非它们以@/开头#

Javascript 正则表达式:匹配下划线包装的单词,除非它们以@/开头#,javascript,regex,markdown,tiptap,Javascript,Regex,Markdown,Tiptap,我试图在Tiptap(Vue的WYSIWYG编辑器)中解决这一问题,方法是传入一个自定义正则表达式,以便在标记(_value)中标识斜体符号的正则表达式不会应用于以@或#开头的字符串,例如#某些标记_value不会转换为#sometagvalue 这是到目前为止我的正则表达式-/(^.[^@.\uw])(?:\w?(^([^.]+))/g 编辑:在@Wiktor Stribiżew/(^ |[^ ^@#w])(([^]+)g)/g的帮助下新建正则表达式 虽然它满足大多数常见情况,但当 下划线在单

我试图在Tiptap(Vue的WYSIWYG编辑器)中解决这一问题,方法是传入一个自定义正则表达式,以便在标记(
_value
)中标识斜体符号的正则表达式不会应用于以
@
#
开头的字符串,例如
#某些标记_value
不会转换为#sometagvalue

这是到目前为止我的正则表达式-
/(^.[^@.\uw])(?:\w?(^([^.]+))/g

编辑:在@Wiktor Stribiżew
/(^ |[^ ^@#w])(([^]+)g)/g的帮助下新建正则表达式

虽然它满足大多数常见情况,但当 下划线在单词中间,例如ant_farm_u应匹配(antfarm)

我还提供了一些“应该匹配”和“不应该匹配”的案例,以便于测试

应匹配(下划线之间)

不应匹配

@ta_g_
__value__
#some_tag_value
@some_value_here
@some_tag_
#some_val_
#_hello_

就科学而言,这个怪物在Chrome(和Node.js)中工作

let text=`
应匹配(下划线之间)
_斜体文本在这里_
女警察_
_消防队员
千言万语_
_周日的早午餐
不应匹配
@塔格_
__价值观__
#一些标记值
@这里有些价值
@一些标签_
#一些_
#_你好_
`;

让re=/(?您可以使用以下模式:

(?:^|\s)[^@#\s_]*(_([^_]+)_)

详细信息

  • (?:^ |\s)
    -字符串或空格的开头
  • [^@#\s.]*
    -0个或多个字符,而不是
    @
    #
    和空格
  • ([^+)\ucode>-第1组:
    ,1+字符,而不是
    (捕获到第2组),然后

    • 这里有一点,它不像其他答案那样简洁,但我认为更容易理解发生了什么。匹配组
      \3
      就是您想要的

      需要多行标志

      • ^
        -匹配行首
      • ([a-zA-Z\s]+|)
        -多个单词或
      • ([a-zA-Z]+)+?
        -多个单词后跟
        至少一次,但至少匹配一次
      • [a-zA-Z\s]*?
        -最后的话
      • $
        -行尾
      总之,分解的东西要匹配其中的一个

      • \u
      • \u
      • \u
      • \u

      看起来这是一个与使用同样匹配下划线的
      \w
      有关的问题。请尝试
      (^ 124;[^-\\\\\w])(^([^-+))u)
      ,请参见。@Wiktor Stribiżew不幸的是,它与ant\u farmż不匹配,因为您在第一组中有
      \w
      。请尝试
      (?:^-^-^-+\s)[^-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
      ,看看这是否适用于您的所有情况?只要看看捕获组1So中的值,
      (?:^\s)[^@#\s.]*(([^\u]+)-)
      可以根据您的需要工作吗?是的,如果Firefox支持负面外观滞后,我可以使用它:(感谢您的贡献!我应该在最初的问题中提到这一点(目前仅在问题的评论中提到)我不能指定第三方组件稍后使用的匹配组。我只能覆盖的
      输入规则,但将有一个非常具体的匹配逻辑。对于将来遇到此问题的任何人,我现在稍微简化了它(它不再捕获一些标记值,因为我们发现Slack和其他一些与Markdown兼容的编辑器也不这样做)
      (?:^^ |\s)(([^!]+))
(?:^|\s)[^@#\s_]*(_([^_]+)_)
^([a-zA-Z\s]+|_)(([a-zA-Z\s]+)_)+?[a-zA-Z\s]*?$