2011-08-06 31 views
0

在ERE中,反斜槓字符(\,\ a,\ b,\ f,\ n, \ r,\ t,\ v)被認爲是開始轉義序列。 n和 n由擴展正則表達式解釋如何?

然後我看到\\n[\\\n],我可以猜到雖然雙方\\n[\\\n]這裏指\其次是新的生產線,但我很困惑的確切過程來解釋這種序列有多少\ s的需要所有?

UPDATE

我沒有問題的瞭解,編程語言的正則表達式所以請內the lexer上下文。

[[email protected] ]# echo "test\ 
> hi" 
+0

你測試過什麼嗎?似乎是你可以輕鬆嘗試的東西。 – yoda

+1

你在哪裏看到這些?在編程語言的字符串?您是否考慮到,在許多編程語言中,「\\ n」實際上是「\ n」,因爲您需要轉義「\」?因此,正則表達式只是'\ n' –

回答

1

這是依賴於編程語言和它的字符串處理選項。

例如,在Java字符串中,如果需要字符串中的文字反斜槓,則需要將其加倍。所以正則表達式\n必須寫成"\\n"。如果您打算使用正則表達式匹配反斜槓,則需要將其轉義兩次 - 一次用於Java的字符串處理程序,一次用於正則表達式引擎。因此,要匹配\,正則表達式爲\\,並且相應的Java字符串爲"\\\\"

許多編程語言都有特殊的「逐字」或「原始」字符串,您不需要轉義反斜槓。所以正則表達式\n可以寫成普通的Python字符串,如"\\n"或者Python原始字符串,如r"\n"。 Python字符串"\n"是實際的換行符。

這會變得令人困惑,因爲有時不會轉義反斜槓正常工作。例如,Python字符串"\d\n"恰好可用作匹配數字的正則表達式,後跟換行符。這是因爲\d不是Python字符串中公認的字符轉義序列,因此它保留爲文字\d並以此方式提供給正則表達式引擎。 \n被翻譯成一個實際的換行符,但恰好匹配正則表達式所針對的字符串中的換行符。

但是,如果您忘記將結果序列轉換爲有效字符轉義序列的反斜線,則會發生不良事件。例如,正則表達式\bfoo\b匹配整個單詞foo(但它與foobar中的foo不匹配)。如果您將正則表達式字符串編寫爲"\bfoo\b",則\b將被字符串處理器轉換爲退格字符,因此會通知正則表達式引擎匹配<backspace>foo<backspace>,這顯然會失敗。

解決方法:一定要使用,你必須逐字逐句的字符串或使用,你有他們的正則表達式文字(例如JavaScript的和Ruby的/.../。)(例如Python的r"...",.NET的@"..."。)。或者使用RegexBuddy自動將正則表達式轉換爲您的語言特殊格式。

要回到你的例子:作爲一個正則表達式的意思是「匹配任何一個反斜槓或換行符」

  • \\n作爲一個正則表達式的意思是「匹配一個反斜槓,然後n
  • [\\\n]
+0

在該頁面中,我沒有看到'\\ n'或'[\\\ n]'的出現。 –

+0

我不這麼認爲。在您上面的評論中鏈接到的頁面中,它用於查找反斜槓,後跟'n'。查看所有其他例子,其中'\\ t'被轉換爲'\ t'等。 –

+0

該塊用於在雙引號內解析文字字符串。 '後面跟n'沒有意義。 –