我试图在字符串中'='之前提取所有出现的单词,我试图使用此正则表达式var event = {
'summary': 'This is a test Calendar invite using NodeJS',
'location': 'Under the Bridge',
'description': 'I dont ever wanna feel Like I did that day But take me to the place I love Take me all the way',
'start': {
'dateTime': '2018-02-25T12:58:05-07:00',
'timeZone': 'America/Los_Angeles',
},
'end': {
'dateTime': '2018-02-26T06:00:00-07:00',
'timeZone': 'America/Los_Angeles',
},
'recurrence': [
'RRULE:FREQ=DAILY;COUNT=2'
],
'attendees': [
{'email': 'rhcp@gmail.com'}
],
'reminders': {
'useDefault': true
}
};
但它返回null,当我删除第一个'/'和最后一个'/ g'它只返回一次出现,这就是为什么我需要全局标志,任何建议?
答案 0 :(得分:0)
正如Wiktor指出的那样,默认情况下,您只能获得REGEXP_SUBSTR()调用中的第一个字符串。但你可以得到第二,第三,第四等
例如,嵌入到SQL中,您需要以与在perl中处理它们的方式不同的方式处理正则表达式。模式只是模式,修饰符去其他地方,你不能使用$n
来获得第n个被捕获的子表达式,你需要以特定的方式进行以获得第n个匹配模式等。
诀窍是使用内联创建的索引表CROSS JOIN您查询的表,该表包含与您期望出现的模式一样多的连续整数 - 以及更多安全性。 Vertica的REGEXP_SUBSTR()调用允许使用其他参数来执行此操作。见这个例子:
WITH
-- one exemplary input row; concatenating substrings for
-- readability
input(s) AS (
SELECT 'DRIVER={Vertica};COLUMNSASCHAR=1;CONNECTIONLOADBALANCE=True;'
||'CONNSETTINGS=set+search_path+to+public;DATABASE=sbx;'
||'LABEL=dbman;PORT=5433;PWD=;SERVERNAME=127.0.0.1;UID=dbadmin;'
)
,
-- an index table to CROSS JOIN with ... maybe you need more integers ...
loop_idx(i) AS (
SELECT 1
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7
UNION SELECT 8
UNION SELECT 9
UNION SELECT 10
)
,
-- the query containing the REGEXP_SUBSTR() call
find_token AS (
SELECT
i -- the index from the in-line index table, needed
-- for ordering the outermost SELECT
, REGEXP_SUBSTR (
s -- the input string
, '(\w+)=' -- the pattern - a word followed by an equal sign; capture the word
, 1 -- start from pos 1
, i -- the i-th occurrence of the match
, '' -- no modifiers to regexp
, 1 -- the first and only sub-pattern captured
) AS token
FROM input CROSS JOIN loop_idx -- the CROSS JOIN with the in-line index table
)
-- the outermost query filtering the non-matches - the empty strings - away...
SELECT
token
FROM find_token
WHERE token <> ''
ORDER BY i
;
每个找到的模式的结果将是一行:
token
DRIVER
COLUMNSASCHAR
CONNECTIONLOADBALANCE
CONNSETTINGS
DATABASE
LABEL
PORT
PWD
SERVERNAME
UID
你可以在现代SQL中做各种各样的事情 - 但你需要坚持SQL和关系范式 - 这就是全部......
开心玩......
马