【问题标题】:Using regex how do I stop identifiers matching strings使用正则表达式如何停止匹配字符串的标识符
【发布时间】:2018-06-02 05:47:28
【问题描述】:

假设我有这个“代码”我想要 lex。

var text = 'hello'

这是我的正则表达式。

  • 字符串:([a-z\s]+)
  • 标识符:[a-z]+

现在,当我将代码放入 regexr.com 并使用标识符 regex 时,它会匹配字符串作为标识符,我将如何阻止它匹配字符串作为标识符?

【问题讨论】:

    标签: regex lexer


    【解决方案1】:

    什么标识一个字符串?引号。在您的情况下:单引号。

    因此,我们希望将引号之间的内容匹配为字符串。为此,我们可以使用以下惰性正则表达式:

    '.*?'
    

    要允许两个引号,您可以使用:'.*?'|".*?" 或相同的反向引用 (['"]).*?\1

    如果允许转义字符串,它会变得更加复杂。我建议使用递归正则表达式来这样做:

    ((['"])(?>[^'"\\]++|\\.|(?1))*+\2)
    

    Samples matched:

    a = "abc   dsfsd", b= ' abc   dsfsd'
    c ="abc\"   dsfsd"
    d= "abc\\"
    

    要匹配除您可以使用的字符串之外的任何标识符:

    [a-z]+(?=([^']*['][^']*['])*[^']*$)
    

    (或者这里是匹配这两种引号的版本:[a-z]+(?=([^'"]*(["'])[^"']*\2)*[^"']*$)

    同样,如果您想考虑转义引号,它会涉及更多:

    [a-z]+(?=([^"'\\]*(\\.|(["'])([^"'\\]*\\.)*[^"'\\]*\3))*[^"']*$)
    

    我希望,这会有所帮助。

    【讨论】:

    • 谢谢,但是我正在尝试阻止标识符正则表达式匹配字符串。
    • 没问题。已更新。
    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2012-06-05
    相关资源
    最近更新 更多