我正在尝试在Ruby中编写一个正则表达式来测试一个字符串,例如:
"GET \"anything/here.txt\""
重点是,所有内容都可以在外部双引号中,但外部双引号中的所有双引号必须通过反斜杠进行转义(否则它不匹配)。所以举个例子
"GET "anything/here.txt""
这不合适。
我尝试了许多方法来编写正则表达式但是做得很好。谁能帮我这个?谢谢
答案 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)
我不确定正则表达式是否真的是你最好的工具,但是如果你坚持使用正则表达式,我建议将字符串视为一系列标记:引用,然后是一系列的事情要么\\
,\"
或任何不引用的内容,然后是结尾的结束语。所以这个:
^"(\\\\|\\"|[^"])*"$