用于匹配文字字符串的正则表达式

时间:2011-10-17 16:47:47

标签: regex haskell posix

我正在尝试编写一个匹配字符串的正则表达式。为简单起见,我现在只关注双引号(“)字符串。

到目前为止,我有这个:"\"[^\"]*\""

这适用于大多数字符串,但在存在转义双引号时失败,如下所示:

"a string \" with an escaped quote"

在这种情况下,它只匹配转义的报价。

我已经尝试了几件事来允许逃脱报价,但到目前为止我一直没有成功,有人能帮我一把吗?

6 个答案:

答案 0 :(得分:2)

我自己设法解决了这个问题:

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

答案 1 :(得分:1)

试试这个:

"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"

如果您想要多行转义字符串,可以使用:

"[^"\\]*(?:\\.[^"\\]*)*"

答案 2 :(得分:0)

尝试:

"((\\")|[^"(\\")])+"

来自Regular Expression Library

答案 3 :(得分:0)

您需要negative lookbehind。检查一下是否有效?

"\"[^\"]*(?<!\\)"

(?<!\\)"应匹配" 后跟\

答案 4 :(得分:0)

通常你想接受任何逃脱。

" [^"\\]* (?: \\. [^"\\]* )* "将是最快的。

"[^"\\]*(?:\\.[^"\\]*)*"已压缩。

答案 5 :(得分:0)

POSIX没有,AFAIK,支持环视 - 没有它,实际上没有办法只使用正则表达式。但是,根据我拥有的POSIX模拟器(无法访问本机环境或库),在某些情况下,这可能会让您关闭:

"[^\"]*"|"[^\]*\\|\\[^\"]*[\"]

它将使用此源字符串捕获转义引用之前的部分和转义后的部分...(忽略换行符,想象它全部在一个字符串中):

I want to match "this text" and "This text, where there is an escaped 
slash (\\), and an \"escaped quote\" (\")", but I also want to handle\\ escaped
back-slashes, as in "this text, with a \\ backslash: \\" -- with a little
text behind it!

它将捕获这些组:

"this text"                                          -- simple, quoted string
"This text, where there is an escaped slash (\       -- part 1 of quoted string
\), and an \                                         -- part 2
"escaped quote\                                      -- part 3
" (\                                                 -- part 4
")"                                                  -- part 5, and ends with a quote
\\                                                   -- not part of a quoted string
"this text, with a \                                 -- part 1 of quoted string
\ backslash: \                                       -- part 2
\"                                                   -- part 3, and ends with a quote

通过进一步分析,您可以酌情将它们组合在一起:

  • 如果小组以"开头和结尾,那么它就可以了
  • 如果论坛以"开头,并以\结尾,则需要 IMMEDIATELY ,然后是另一个以引号字符结尾的匹配组本身,或递归继续立即跟随另一个匹配组
  • 如果该群组没有立即跟随另一场比赛,则它不属于带引号的字符串

我认为这是你需要的所有分析 - 但一定要测试它!

让我知道这个想法是否有帮助!

修改 附加说明:为了清楚起见,为了使其工作,如果不将它们用作分隔符,则必须对整个源字符串中的所有引号进行转义,并且反斜杠必须在任何地方进行转义