现在,我正在写一个词法分析器,我希望能够在考虑转义字符的同时匹配字符串令牌。
所以,我希望能够解析这样的事情:
'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次:开放标记,字符串本身,最后是结束标记。一旦我识别了一个令牌,我就会将匹配的令牌推送到一个数组中,并从我正在使用的数据的开头删除完整的匹配。
我试图修改我的规则来解释逃脱的角色,但我还没有能够让它发挥作用,坦白说,我真的不知道从哪里去这里。我甚至为尝试什么而感到茫然。如果我检查反斜杠,它就不会为两个人工作。如果我检查两个,它就不会工作三个等等。
有人可以让我走上正确的道路来实现这个目标吗?除此之外,我的词法分析器已经完成并完成它必须做的事情。这是唯一剩下的东西。
答案 0 :(得分:1)
您可以使用
/^\s*(')([^'\\]*(?:\\.[^'\\]*)*)(')/s
请参阅regex demo。
<强>详情
^
- 字符串开头\s*
- 0+空白字符(')
- 捕获第1组:'
字符([^'\\]*(?:\\.[^'\\]*)*)
- 捕获第2组:
[^'\\]*
- 除'
和\
(?:\\.[^'\\]*)*
- 重复0次或以上:
\\.
- \
后跟任何字符[^'\\]*
- 除'
和\
(')
- 捕获第3组:'
。