我想动态创建一个正则表达式模式。我能够构建包含模式的字符串。现在,在像
这样的定义中 std::regex pattern{ R"((\w)+)" };
"((\w)+)"
需要是包含我正在创建的模式的字符串。
但是如何在字符串之外添加R
?
我可以使用转义字符创建字符串。但我很好奇是否有办法绕过它。
假设
std::string myPatternWithoutEscapeChar;
是我的字符串,其中包含没有转义字符的正则表达式,比如([\]+)
而不是([\\]+)
我想做的事情等于
std::regex pattern{ R... };
与上面第一个定义中的R
一样,...
是myPatternWithoutEscapeChar
内""
的内容。
答案 0 :(得分:1)
如果您使用的是原始字符串结构,则无关紧要 它被传递给重要的正则表达式引擎。
因此,与往常一样,语言字符串解析阶段,然后是正则表达式解析阶段 这就是为什么首先在原始状态下编写和调试整个正则表达式非常重要的原因 这避免了任何混淆。
首先使用工具创建/测试正则表达式。一个好的是RegexFormat 5 它像瑞士军刀一样用于正则表达式加工。它还有一个嵌入式正则表达式引擎 完整的测试工具查找/替换范例。格式/压缩,Eror检查,并将使 任何类型的字符串,包括raw,你可以放入你的源代码。它也是 可以获取源代码字符串,解析它们的语言,然后用于正则表达式,然后处理正则表达式。
你唯一关心的是正则表达式,你应该学习。
第一课是正则表达式是一种语言,它包含元字符构造组合。
metachar的样本是.,?,\,+,*,^,$,#,[,],(,)
它们都具有特殊含义,具体取决于
如何使用它们。构造可以是一系列metachars / normal chars,它开始它结束,
示例(?'Var' ... )
与所有语言一样,需要有一种方法在代码结构中引入文字。
如果匹配的文字是元字符,则会产生冲突。
为了区分它具有字面意义,转义字符放在它前面。
但是当匹配的文字是实际的转义字符时会发生什么? 它,逃脱角色实际上是逃脱的,现在它具有字面含义。
你真的不想假设正则表达式看起来像下面的引擎原始表示。
原始表示缺乏语言或正则表达式分隔符。
例如,您提到([\]+) as opposed to ([\\]+)
原始格式([\]+)
不会编译成正则表达式对象
它有一个开放的元咒[
一个文字元咒\]
没有关闭元咒]
。
这个([\\]+)
更好,它有一个开头[
,其中包含一个文字\
,然后是一个结束]
。
因此,([\\]+)
RAW 正则表达式。
然后,它以双引号字符串"([\\\\]+)"
呈现给语言
或者作为原始字符串R"([\\]+)"
。
我只看了一下新的C ++ 11 Raw字符串结构,我知道你可以使用任何系列的 字符,所以这只是一般信息。
祝你好运!