我想解析這個例子正則表達式。在這個正則表達式中\ +的含義是什麼?
我知道斜線可以用作轉義字符。所以,如果你想搜索),但這並不意味着一個分組,你會做\
然後)
拼寫了這一點,以避免堆棧溢出的正則表達式...
我也知道,一個加號可以顯示一個或多個先前的項目。
但是在下面的例子中,是加號還是斜線越過了?看起來第一個斜線可以讓你「逃避」第二個斜線,然後加號表示至少有一個斜線 - 但這個例子說明串中至少有兩個+ ...
這個正則表達式是什麼意思?有太多的新事物可以解析它。
我想解析這個例子正則表達式。在這個正則表達式中\ +的含義是什麼?
我知道斜線可以用作轉義字符。所以,如果你想搜索),但這並不意味着一個分組,你會做\
然後)
拼寫了這一點,以避免堆棧溢出的正則表達式...
我也知道,一個加號可以顯示一個或多個先前的項目。
但是在下面的例子中,是加號還是斜線越過了?看起來第一個斜線可以讓你「逃避」第二個斜線,然後加號表示至少有一個斜線 - 但這個例子說明串中至少有兩個+ ...
這個正則表達式是什麼意思?有太多的新事物可以解析它。
但在下面的例子中,加號或斜線得到逃脫?
Both!
\
已被轉義,因爲您正在使用的查詢語言可能將其用作轉義字符本身(即,用於轉義引號)。所以\\
被理解爲正則表達式中的單個\
,然後用它來轉義+
。正則表達式意味着一個單獨的+
,後跟零個或多個+
。
它可能可以重寫爲\\++
,其中第二個+
實際上是正則表達式量詞。
文檔(假設postgres):http://www.postgresql.org/docs/8.1/static/functions-matching.html#POSIX-ESCAPE-SEQUENCES – cmbuckley
啊,你去了,我沒有認識到SQL的味道。 – Vache
@cbuckley Vache是什麼意思'逃脫報價' – bernie2436
這個正則表達式實際上可能意味着兩種不同的東西,這取決於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
設置。
我已經添加了[tag:postgresql]標記,因爲正則表達式看起來可能如此。如果錯誤,您可以更改標籤。 – cmbuckley
您的PostgreSQL版本在這裏很重要,正如'standard_conforming_strings'參數的值一樣。這可能是一個奇怪的短語正則表達式,用於查找以兩個或更多\ s('standard_conforming_strings = on')開頭或以'++'('standard_conforming_strings = off')開頭的任何內容。 –