2017-08-06 114 views
-1

用正則表達式特殊字符的字符串我在文件中的行包含以下字符串匹配包含在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。爲什麼?

回答

0

您的第一個字符串是用雙引號引起的,所以處理了反斜槓轉義序列。

\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字符串 –