条件RegEx替换

时间:2015-09-18 13:02:13

标签: c++ regex windows

我有一个字符串:

key_col = ['col1','col2']
df_with_idx = df.reset_index()
common = pd.merge(df_with_idx,other,on=key_col)['index']
mask = df_with_idx['index'].isin(common)

desired_result =  df_with_idx[~mask].drop('index',axis=1)

我想在std::string String = "<!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\"><!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\">"; 符号后面\n ><![LOG[插入>个字符。

到目前为止我的代码:

#include <regex>

const std::tr1::regex pattern( "(>|\")<!\\[LOG\\[" );
std::string replace = ">\n<![LOG[";
std::string newtext = std::tr1::regex_replace( String, pattern, replace );
std::cout << newtext << std::endl;

这很好用,但不幸的是有一点问题。并非每一行都以>结尾。在某些情况下,应保留\"<!\\[LOG\\[而不是><!\\[LOG\\[

如果缺少上一个>,那么结果将是"\n<![LOG[而不是>\n<![LOG[

所以我的问题是,解决这个问题的最简单/最好的方法是什么? 我应该以某种方式检查模式是否存在,然后相应地设置替换字符串?

希望我想要的是可以理解的。

感谢。

更新
对不起,但正如我所看到的,我犯了一个错误,字符串看起来如何,这引起了一些误解。 日志文件中的字符串(我将日志文件读入std :: string并进行处理)如下所示。这实际上是两行,但缺少换行符,这就是我要插入的内容。

情况1:
字符串看起来像这样:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"><![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">

从此我想得到结果:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">**LineBreakHere** <![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">

请注意换行符的位置。

案例2: 字符串几乎如下:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"

请注意,>

后缺少file="myfile.cpp"

如果是这种情况,我希望得到与以前相同的结果:
<![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp">**LineBreakHere and the missing > was also inserted** <![LOG[somestring]LOG]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponent" context="" type="1" thread="0" file="myfile.cpp"> **also inserted missing >**

所以基本上,我想插入换行符,如果缺少>我也想插入它,如果可能的话。

1 个答案:

答案 0 :(得分:1)

你的正则表达式应该是

"(>|\")<!\\\\\\[LOG\\\\\\["

\的4个斜线和2个用于转出方括号的斜杠。编写regexp的更好方法是使用R"(...)"表示法(&#34;原始字符串文字&#34;):

const std::regex pattern( R"((>|\")<!\\\[LOG\\\[)" );

代码将是:

const std::regex pattern( R"((>|\")<!\\\[LOG\\\[)" );
std::string String = "<!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\"><!\\[LOG\\[somestringhere\\]LOG\\]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponenet\" context=\"\" type=\"1\" thread=\"0\" file=\"mxyfile.cpp\">";
std::string replace = "$1\n<![LOG[";
std::string newtext = std::regex_replace( String, pattern, replace );
std::cout << newtext << std::endl;

nextext

<!\[LOG\[somestringhere\]LOG\]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponenet" context="" type="1" thread="0" file="mxyfile.cpp">
<![LOG[somestringhere\]LOG\]!><time="12:34:30.0+120" date="9-14-2015" component="mycomponenet" context="" type="1" thread="0" file="mxyfile.cpp">

请注意,替换字符串现在包含对第一个捕获组(由括号$1内的子模式匹配的组)的反向引用(<|\"),我们可以在替换内部安全地恢复它。我用反斜杠修改了所有内容。

IDEONE demo

A regex demo

<强>更新

您可以使用R"((<!\[LOG\[[\s\S]*?\]!><[^<]*)(\">?))"正则表达式:

const std::regex pattern( R"((<!\[LOG\[[\s\S]*?\]!><[^<]*)(\">?))" );
std::string String = "<![LOG[somestring]LOG]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponent\" context=\"\" type=\"1\" thread=\"0\" file=\"myfile.cpp\"<![LOG[somestring]LOG]!><time=\"12:34:30.0+120\" date=\"9-14-2015\" component=\"mycomponent\" context=\"\" type=\"1\" thread=\"0\" file=\"myfile.cpp\"";
std::string replace = "$1\">\n";
std::string newtext = std::regex_replace( String, pattern, replace );
std::cout << newtext << std::endl;

Ideone demo

REGEX说明:

该模式有两个捕获组:一个捕获<![LOG[的开头直到下一个节点的末尾((<!\[LOG\[[\s\S]*?\]!><[^<]*)),另一个捕获具有右尖括号或报价仅为(">|")

  • (<!\[LOG\[ - 按字面意义匹配<![LOG[(第一个捕获组的开头)
  • [\s\S]*? - 匹配0个或更多字符(甚至是换行符)
  • \]!>< - 按字面意思匹配]!><
  • [^<]*) - 匹配<以外的0个或更多字符(第一个捕获组的结尾)
  • (\">|\") - 匹配并捕获">"。您可以将其写为(\">?)