关于逃避逃避的红宝石正则表达式

时间:2012-02-13 04:42:19

标签: ruby regex

我正在尝试在Ruby中编写一个正则表达式来测试一个字符串,例如:
"GET \"anything/here.txt\""

重点是,所有内容都可以在外部双引号中,但外部双引号中的所有双引号必须通过反斜杠进行转义(否则它不匹配)。所以举个例子
"GET "anything/here.txt"" 这不合适。

我尝试了许多方法来编写正则表达式但是做得很好。谁能帮我这个?谢谢

4 个答案:

答案 0 :(得分:5)

你可以使用积极的lookbehind:

/\A"((?<=\\)"|[^"])*"\z/

这正是您所要求的:“如果双引号出现在外部双引号内而没有前缀的反斜杠,则它不匹配。”

一些意见:

\A\z:这些只匹配字符串的开头 end 。因此模式必须与整个字符串匹配,而不是它的一部分。 (?<=):这是正面观察的语法;它断言模式必须在当前位置之前直接匹配。所以(?<=\\)"匹配“双引号,后面加一个反斜杠”。 [^"]:这匹配“任何不是反斜杠的字符”。

关于这个正则表达式的一点是,它匹配一个内部双引号,前面是两个反斜杠。如果这是一个问题,发表评论,我会解决它。

如果您的Ruby版本没有lookbehind,您可以执行以下操作:

/\A"(\\.|[^"\\])*"\z/

请注意,与第一个正则表达式不同,这个不会计算双反斜杠作为转义引号(而是第一个反斜杠转义第二个),因此"\\""将不匹配。

答案 1 :(得分:1)

这有效:

/"(?<method>[A-Z]*)\s*\\\"(?<file>[^\\"]*)\\""/

Rubular上查看。

编辑:

"(?<method>[A-Z]*)\s(?<content>(\\\"|[a-z\/\.]*)*)"

here

编辑2:没有(?...)序列(对于Ruby 1.8.6):

"([A-Z]*)\s((\\\"|[a-z\/\.]*)*)"

Rubular here

答案 2 :(得分:0)

在Rubular上成功测试过:

\"GET \\\".*\\\"\"

击穿:
\“ - 为正则表达式字符串转义”,意思是字面字符“
GET - 假设你只想要GET而不是明确的 \\“ - Escape \和”获取文字字符串\“
。* - 除了\ n
之外的任何字符的0或更多 \\“\” - 逃避文字\“”

答案 3 :(得分:0)

我不确定正则表达式是否真的是你最好的工具,但是如果你坚持使用正则表达式,我建议将字符串视为一系列标记:引用,然后是一系列的事情要么\\\"或任何不引用的内容,然后是结尾的结束语。所以这个:

^"(\\\\|\\"|[^"])*"$