【发布时间】:2018-06-02 05:47:28
【问题描述】:
假设我有这个“代码”我想要 lex。
var text = 'hello'
这是我的正则表达式。
- 字符串:([a-z\s]+)
- 标识符:[a-z]+
现在,当我将代码放入 regexr.com 并使用标识符 regex 时,它会匹配字符串作为标识符,我将如何阻止它匹配字符串作为标识符?
【问题讨论】:
假设我有这个“代码”我想要 lex。
var text = 'hello'
这是我的正则表达式。
现在,当我将代码放入 regexr.com 并使用标识符 regex 时,它会匹配字符串作为标识符,我将如何阻止它匹配字符串作为标识符?
【问题讨论】:
什么标识一个字符串?引号。在您的情况下:单引号。
因此,我们希望将引号之间的内容匹配为字符串。为此,我们可以使用以下惰性正则表达式:
'.*?'
要允许两个引号,您可以使用:'.*?'|".*?" 或相同的反向引用 (['"]).*?\1。
如果允许转义字符串,它会变得更加复杂。我建议使用递归正则表达式来这样做:
((['"])(?>[^'"\\]++|\\.|(?1))*+\2)
a = "abc dsfsd", b= ' abc dsfsd'
c ="abc\" dsfsd"
d= "abc\\"
要匹配除您可以使用的字符串之外的任何标识符:
[a-z]+(?=([^']*['][^']*['])*[^']*$)
(或者这里是匹配这两种引号的版本:[a-z]+(?=([^'"]*(["'])[^"']*\2)*[^"']*$))
同样,如果您想考虑转义引号,它会涉及更多:
[a-z]+(?=([^"'\\]*(\\.|(["'])([^"'\\]*\\.)*[^"'\\]*\3))*[^"']*$)
我希望,这会有所帮助。
【讨论】: