我正在使用此查询:
SELECT
REGEXP_SUBSTR ('test1 test2 test3', '[^\t]+', 1, 1) field1,
REGEXP_SUBSTR ('test1 test2 test3', '[^\t]+', 1, 2) field2,
REGEXP_SUBSTR ('test1 test2 test3', '[^\t]+', 1, 3) field3
FROM DUAL
我正在寻找具有每个值的每个字段。这是一个制表符分隔的字符串。但是我得到的是随机输出。
正在寻找:
field1 field2 field3
test1 test2 test3
获取:
field1 field2 field3
es es es
我想念什么?
谢谢
答案 0 :(得分:4)
let obj1 = {};
let obj2 = [];
console.log(obj1.length); // undefined: objects don't have length
console.log(obj1.hasOwnProperty); // native function (ie. truthy)
console.log(obj2.length); // 0: Arrays have length and this one's is 0
console.log(obj2.map); // the native function (ie. truthy)
将匹配不是反斜杠也不是[^\t]+
字符的字符。
所以
t
将输出:
FIELD1 | FIELD2 | FIELD3 :----- | :----- | :----- aaa | bbb | ccc
已在SELECT
REGEXP_SUBSTR ('aaatbbb\ccc', '[^\t]+', 1, 1) field1,
REGEXP_SUBSTR ('aaatbbb\ccc', '[^\t]+', 1, 2) field2,
REGEXP_SUBSTR ('aaatbbb\ccc', '[^\t]+', 1, 3) field3
FROM DUAL
和\
上拆分了字符串
如果要在制表符上拆分它,则:
t
哪个输出:
FIELD1 | FIELD2 | FIELD3 :----- | :----- | :----- test1 | test2 | test3
db <>提琴here
答案 1 :(得分:2)
方括号内的字符是interpreted as literal characters,而不是转义字符-因此,您要匹配't'
或'\'
以外的任何字符,而不是制表符。
您可以使用串联嵌入一个实际的制表符:
SELECT
REGEXP_SUBSTR ('test1 test2 test3', '[^'||chr(9)||']+', 1, 1) field1,
REGEXP_SUBSTR ('test1 test2 test3', '[^'||chr(9)||']+', 1, 2) field2,
REGEXP_SUBSTR ('test1 test2 test3', '[^'||chr(9)||']+', 1, 3) field3
FROM DUAL;
FIELD FIELD FIELD
----- ----- -----
test1 test2 test3
尽管如此,您可能对相邻的标签有疑问:
SELECT
REGEXP_SUBSTR ('test1 test3', '[^'||chr(9)||']+', 1, 1) field1,
REGEXP_SUBSTR ('test1 test3', '[^'||chr(9)||']+', 1, 2) field2,
REGEXP_SUBSTR ('test1 test3', '[^'||chr(9)||']+', 1, 3) field3
FROM DUAL;
FIELD FIELD FIELD3
----- ----- ------
test1 test3
一个safer pattern是:
SELECT
REGEXP_SUBSTR ('test1 test3', '(.*?)('||chr(9)||'|$)', 1, 1, null, 1) field1,
REGEXP_SUBSTR ('test1 test3', '(.*?)('||chr(9)||'|$)', 1, 2, null, 1) field2,
REGEXP_SUBSTR ('test1 test3', '(.*?)('||chr(9)||'|$)', 1, 3, null, 1) field3
FROM DUAL;
FIELD FIELD2 FIELD
----- ------ -----
test1 test3