匹配包含在Perl

问题描述:

用正则表达式特殊字符的字符串我在文件中的行包含以下字符串匹配包含在Perl

$print = "SM_sdo_debugss_cxct6_CSCTM_4 \csctm_gen[4]_ctm_i_nctm_I_csctm (4+5)"; 
$my_meta = '\csctm_gen[4]_ctm_i_nctm_I_csctm'; 
print "I got this\n" if($print =~ /\Q$my_meta\E/); 

但它无法找到$my_meta字符串中$print。为什么?

您的第一个字符串是用双引号引起的,所以处理了反斜杠转义序列。

\cs代表Ctrl-S,它也可以写成​​或"\x13"

你的第二个字符串是单引号,它忽略了反斜杠转义(除了\\\')。

所以,你的正则表达式最终找了3个字符的序列\cs,但你的目标字符串包含一个单字节0x13

若要解决此问题,请在您的第一个字符串中写入"... \\cs ..."(第一个反斜杠转义第二个反斜杠),或者为您的第一个字符串('... \cs ...')使用单引号。

+0

但我没有任何控制编辑我的$ my_meta,它会来自处理其他文件。我想在我的正则表达式中放置一个条件,它会将任何带有特殊字符的字符串作为搜索字符串。我的观点清楚了吗?谢谢 –

+0

@AbhishekDas不,它不是很清楚。你是说你想解释'$ my_meta'中的一些反斜杠序列,而不是其他的?无论如何,如果你想要解决真正的问题,请展示你真实的代码。 – melpomene

+0

在实际情况下,$ my_meta将来自其他一些脚本,$ my_meta的内容可能有反斜杠,我将在文件中搜索并获取相应的行号。所以我不能像你在解决方案中所建议的那样编辑$ my_meta的内容。我必须在'if($ print =〜/ \ Q $ my_meta \ E /);'语句中捕获$ my_meta字符串 –