无法转换正则表达式

时间:2014-09-24 20:21:35

标签: regex boost

这个正则表达式:

"REGION\\((.*?)\\)(.*?)END_REGION\\((.*?)\\)"

目前找到此信息:

REGION(Test) my user typed this

END_REGION(Test)

我需要它来找到这个信息:

#region REGION my user typed this

#endregion END_REGION

我试过了:

"#region\\ (.*?)\\\n(.*?)#endregion\\ (.*?)\\\n"

它告诉我模式分配失败了。有人可以解释一下我做错了什么吗?我是Regex的新手。

4 个答案:

答案 0 :(得分:1)

似乎问题出在多线\n。我的建议是使用修饰符s来避免多线复杂性,例如:

/#region\ \(.*?\)(.*?)\s#endregion\s\(.*?\)/s

Online Demo

  • s 修饰符“单行”使.与所有字符匹配,包括换行符。

答案 1 :(得分:1)

试试这个:

#region(.*)?\n(.*)?#endregion(.*)?

这在我测试时适用于我:http://regexpal.com/

使用原始文本和正则表达式时,唯一抛弃它的是我最后没有新行,因为您的示例文本没有。

答案 2 :(得分:1)

即使使用扩展修饰符,构造此正则表达式也不会因使用boost而失败。

你的编译器字符串:

"#region\\ (.*?)\\\n(.*?)#endregion\\ (.*?)\\\n"

经编译器解析后:

#region\ (.*?)\\n(.*?)#endregion\ (.*?)\\n  

看起来在换行符上有太多的逃脱。

如果您将正则表达式展开为提升,则未转义的英镑符号#将被解释为注释。
在这种情况下,你需要逃脱英镑符号。

\#region\ (.*?)\\n(.*?)\#endregion\ (.*?)\\n  

如果您不使用扩展修饰符,则无需转义空格字符。
采取这种方法,你可以删除空间上的逃逸,并修复换行符,它看起来像这个原始(什么传递给正则表达式引擎):

#region (.*?)\n(.*?)#endregion (.*?)\n

并像这样作为源代码字符串:

"#region (.*?)\\n(.*?)#endregion (.*?)\\n"

答案 3 :(得分:1)

当转义换行符\\\n时,您的正则表达式会有一个额外的反斜杠,而是使用\\s*。同样对于最后一个捕获组,您可以使用贪心量词,并删除换行序列。

#region\\ (.*?)\\s*(.*?)#endregion\\ (.*)

Compiled Demo