2013-12-11 75 views
2

我想解析這個例子正則表達式。在這個正則表達式中\ +的含義是什麼?

我知道斜線可以用作轉義字符。所以,如果你想搜索),但這並不意味着一個分組,你會做\然後)拼寫了這一點,以避免堆棧溢出的正則表達式...

我也知道,一個加號可以顯示一個或多個先前的項目。

但是在下面的例子中,是加號還是斜線越過了?看起來第一個斜線可以讓你「逃避」第二個斜線,然後加號表示至少有一個斜線 - 但這個例子說明串中至少有兩個+ ...

這個正則表達式是什麼意思?有太多的新事物可以解析它。

enter image description here

+1

我已經添加了[tag:postgresql]標記,因爲正則表達式看起來可能如此。如果錯誤,您可以更改標籤。 – cmbuckley

+0

您的PostgreSQL版本在這裏很重要,正如'standard_conforming_strings'參數的值一樣。這可能是一個奇怪的短語正則表達式,用於查找以兩個或更多\ s('standard_conforming_strings = on')開頭或以'++'('standard_conforming_strings = off')開頭的任何內容。 –

回答

8

但在下面的例子中,加號或斜線得到逃脫?

Both!

\已被轉義,因爲您正在使用的查詢語言可能將其用作轉義字符本身(即,用於轉義引號)。所以\\被理解爲正則表達式中的單個\,然後用它來轉義+。正則表達式意味着一個單獨的+,後跟零個或多個+

它可能可以重寫爲\\++,其中第二個+實際上是正則表達式量詞。

+0

文檔(假設postgres):http://www.postgresql.org/docs/8.1/static/functions-matching.html#POSIX-ESCAPE-SEQUENCES – cmbuckley

+0

啊,你去了,我沒有認識到SQL的味道。 – Vache

+0

@cbuckley Vache是​​什麼意思'逃脫報價' – bernie2436

2

這個正則表達式實際上可能意味着兩種不同的東西,這取決於PostgreSQL版本和standard_conforming_strings的值。

舊版本(在standard_conforming_strings之前或默認關閉的版本)會將該字符串解釋爲反斜線轉義的字符串。因此PostgreSQL會將\\+\\+*轉換爲\+\+*,即它會消耗一定程度的轉義。然後,正則表達式將消耗剩餘的級別來跳出這些加號,所以它們被解釋爲文字+不是限定符。該正則表達式說明++後跟零個或多個其他字符

根據SQL標準,standard_conforming_strings默認爲on的較新版本將不會將反斜槓解碼爲轉義符。因此,您將運行正則表達式\\+\\+*,即一個或多個反斜槓,接着是一個或多個反斜槓,然後是... oops,沒有前面字符的星號是錯誤

因此,我們知道您必須關閉standard_conforming_strings,因爲查詢將無法編譯新的正則表達式。

regress=> SELECT 'blah' ~ '\\+\\+*'; 
ERROR: invalid regular expression: quantifier operand invalid 

postgres=> SHOW standard_conforming_strings; 
standard_conforming_strings 
----------------------------- 
on 
(1 row) 

你以後會遇到這個問題,所以我建議你在升級之前處理它。

假設x_spam_level場總是與加號,這正則表達式不檢查開始,該代碼可以被更好地寫成:

x_spam_level LIKE '++%' 

如果它不與加號開始使用:

x_spam_level LIKE '%++%' 

這是當前正則表達式正在做什麼。 PostgreSQL會將其轉化爲內部的正則表達式,但您不必擔心轉義。

如果你想使用正則表達式,並讓它在所有版本的行爲consisently,使用方法:

x_spam_level ~ E'\\+\\+*' 

E''語法告訴PostgreSQL的解碼反斜槓,不論standard_conforming_strings設置。

相關問題