使用正则表达式如何停止匹配字符串的标识符

时间:2018-06-02 05:47:29

标签: regex lexer

我们说我有这个"代码"我想要lex。

var text = 'hello'

这是我的正则表达式。

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

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

1 个答案:

答案 0 :(得分: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))*[^"']*$)

我希望,这有帮助。