如何使用正则表达式为我的词法分析器转义字符串文字?
How do I escape string literals using regex for my lexer?
现在,我正在编写词法分析器,我希望能够在考虑转义字符的同时匹配字符串标记。
所以,我希望能够解析这样的东西:
'Hello World'
作为 [', Hello World, ']
,
'There\'s an apostrophe in here'
作为 [', There's an apostrophe in here, ']
'This is a backslash: \'
为 [', This is a backslash: \, ']
。
目前,我有以下用于匹配字符串的正则表达式规则:/^\s*(')(.*?)(')/s
。 ^\s*
负责前导空格,而 (')(.*?)(')
匹配字符串 3 次:开始标记、字符串本身,最后是结束标记。一旦我识别出一个标记,我将匹配的标记放入一个数组,并从我正在处理的数据的开头删除完整匹配。
我已经尝试修改我的规则以考虑转义字符,但我无法让它工作,坦率地说,我真的不知道从这里该何去何从。我不知道该尝试什么。如果我检查反斜杠,它不会为两个工作。如果我检查两个,它就不会检查三个,等等
有人可以让我走上正确的轨道来实现这个吗?除此之外,我的词法分析器已经完成并完成了它必须做的事情。这是唯一剩下的东西。
您可以使用
/^\s*(')([^'\]*(?:\.[^'\]*)*)(')/s
参见regex demo。
详情
^
- 字符串开头
\s*
- 0+ 个空白字符
(')
- 捕获组 #1:a '
char
([^'\]*(?:\.[^'\]*)*)
- 捕获组 #2:
[^'\]*
- '
和 \
以外的 0+ 个字符
(?:\.[^'\]*)*
- 重复 0 次或多次:
\.
- \
后跟任意字符
[^'\]*
- '
和 \
以外的 0+ 个字符
(')
- 捕获组 #3:a '
.
现在,我正在编写词法分析器,我希望能够在考虑转义字符的同时匹配字符串标记。
所以,我希望能够解析这样的东西:
'Hello World'
作为[', Hello World, ']
,'There\'s an apostrophe in here'
作为[', There's an apostrophe in here, ']
'This is a backslash: \'
为[', This is a backslash: \, ']
。
目前,我有以下用于匹配字符串的正则表达式规则:/^\s*(')(.*?)(')/s
。 ^\s*
负责前导空格,而 (')(.*?)(')
匹配字符串 3 次:开始标记、字符串本身,最后是结束标记。一旦我识别出一个标记,我将匹配的标记放入一个数组,并从我正在处理的数据的开头删除完整匹配。
我已经尝试修改我的规则以考虑转义字符,但我无法让它工作,坦率地说,我真的不知道从这里该何去何从。我不知道该尝试什么。如果我检查反斜杠,它不会为两个工作。如果我检查两个,它就不会检查三个,等等
有人可以让我走上正确的轨道来实现这个吗?除此之外,我的词法分析器已经完成并完成了它必须做的事情。这是唯一剩下的东西。
您可以使用
/^\s*(')([^'\]*(?:\.[^'\]*)*)(')/s
参见regex demo。
详情
^
- 字符串开头\s*
- 0+ 个空白字符(')
- 捕获组 #1:a'
char([^'\]*(?:\.[^'\]*)*)
- 捕获组 #2:[^'\]*
-'
和\
以外的 0+ 个字符
(?:\.[^'\]*)*
- 重复 0 次或多次:\.
-\
后跟任意字符[^'\]*
-'
和\
以外的 0+ 个字符
(')
- 捕获组 #3:a'
.